c# - serializar - ¿Cuáles son los inconvenientes de desactivar ProxyCreationEnabled para CTP5 del código EF primero
serializar json c# (4)
La única forma en que mi servicio WCF puede devolver clases desde un primer modelo de código es configurando ProxyCreationEnable
en false
usando el siguiente código.
((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false;
¿Cuáles son las consecuencias negativas de hacer esto? Una ventaja es que al menos puedo serializar estos tipos dinámicos para que puedan enviarse por cable usando WCF.
(Usando Visual Studio 2013 o posterior)
Para evitar la edición del constructor de clase en su modelo EF cada vez que actualiza el modelo desde la base de datos, o de alguna otra manera desencadena la reconstrucción del código, el lugar adecuado para hacer el cambio está en el archivo de código T4 que es responsable de realmente creando el código modelo. Tuve otro problema con las propiedades dinámicas hace unos años cuando entendí la mecánica subyacente de cómo se crearon realmente las clases y las propiedades. T4 !!! Qué milagro es: - La sintaxis T4 puede ser un poco intimidante al principio, por lo que es sabio leer la sintaxis. Estar MUY enfocado al hacer cambios también es una buena idea :-)
¡Asi que! Si busca en su modelo, tiene un archivo .tt debajo de su archivo .edmx. Este archivo .tt (T4) es el script que realmente crea su clase de modelo. El script se ejecutará automáticamente cada vez que construya su modelo o realice algunos cambios en el editor de modelos.
Digamos que su descriptor de modelo se llama Model1.edmx . Tendrás un archivo llamado Model1.Context.tt en el árbol debajo de él. También verá un archivo Model1.Context.cs . Este es obviamente el archivo de código real para su contexto. ¡Pero este archivo es el resultado del archivo de script .tt que se está ejecutando ! Está creado de forma completamente dinámica. Así que no tengo idea de editarlo.
Abra el archivo .tt y verá algo como:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension=".cs"#><#
const string inputFile = @"Model1.edmx";
var textTransform = DynamicTextTransformation.Create(this);
..
..
Cerca de 50 líneas más, el código del constructor está siendo guionado.
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>
using System.Data.Entity.Core.Objects;
using System.Linq;
<#
}
#>
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
base.Configuration.ProxyCreationEnabled = false;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoadingEnabled = false;
<#
}
He agregado la propiedad base.Configuration.ProxyCreationEnabled = false;
para que sea la primera línea en el constructor.
Guarde su archivo y abra el archivo Model1.Context.cs para ver el código resultante. Si desea forzar la ejecución de la secuencia de comandos de la plantilla, seleccione el menú
Build - Tranforma todas las plantillas de T4
Es fácil saber si cometió un error en su código T4, ya que el archivo .cs no se creará o si se abrirán errores en el editor.
Cuando utilizas EF, crea un proxy por defecto para tu clase. Una solución puede ser agregar esta línea en el constructor de su clase DbContext. Su modelo de datos heredado de la clase DbContext, para que pueda editar su modelo de esta manera:
public yourDataModelEntities()
: base("name=yourDataModelEntities")
{
base.Configuration.ProxyCreationEnabled = false;
}
Esta clase se encuentra en su EF.edmx
luego en el yourmodel.Context.tt
luego su yourmodel.Context.cs
Los proxies dinámicos se utilizan para el seguimiento de cambios y la carga diferida. Cuando WCF intenta serializar un objeto, el contexto relacionado suele cerrarse y eliminarse, pero la serialización de las propiedades de navegación activará automáticamente la carga diferida (en contexto cerrado) => excepción.
Si desactivas la carga diferida, deberás usar la carga ansiosa para todas las propiedades de navegación que quieras usar (Incluir en ObjectQuery). Los cambios de seguimiento no funcionan en WCF, solo funciona para la modificación de la entidad que está asociada a ObjectContext.
Si DbContext.Configuration.ProxyCreationEnabled
se establece en false
, DbContext no cargará objetos secundarios para algún objeto principal a menos que se llame al método Include
en el objeto principal. Establecer DbContext.Configuration.LazyLoadingEnabled
en true
o false
no tendrá ningún impacto en sus comportamientos.
Si DbContext.Configuration.ProxyCreationEnabled
se establece en true
, los objetos secundarios se cargarán automáticamente y el valor DbContext.Configuration.LazyLoadingEnabled
controlará cuando se carguen objetos secundarios.