La única manera de que mi servicio WCF puede volver clases desde un primer modelo de código es mediante el establecimiento de la ProxyCreationEnable
a false
con 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.
fuente
Si
DbContext.Configuration.ProxyCreationEnabled
se establece enfalse
, DbContext no cargará objetos secundarios para algún objeto principal a menosInclude
que se llame al método en el objeto principal. AjusteDbContext.Configuration.LazyLoadingEnabled
atrue
, ofalse
no tendrá ningún impacto en sus comportamientos.Si
DbContext.Configuration.ProxyCreationEnabled
se establece entrue
, los objetos secundarios se cargarán automáticamente y elDbContext.Configuration.LazyLoadingEnabled
valor controlará cuándo se cargan los objetos secundarios.fuente
Cuando usa EF, crea un proxy de forma predeterminada para su 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, por lo que puede editar su modelo de esta manera:
public yourDataModelEntities() : base("name=yourDataModelEntities") { base.Configuration.ProxyCreationEnabled = false; }
Esta clase está en tu
EF.edmx
entonces en elyourmodel.Context.tt
entoncesyourmodel.Context.cs
fuente
(Con Visual Studio 2013 o posterior)
Para evitar la edición del constructor de la clase en su modelo EF cada vez que actualiza el modelo de la base de datos, o de alguna otra manera desencadena la reconstrucción del código, el lugar adecuado para realizar el cambio es en el archivo de código T4 que es responsable de creando realmente el código del modelo. Tuve algún 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 propiedades. T4 !!! Qué milagro es :- La sintaxis de D T4 puede ser un poco intimidante al principio, así que leer sobre la sintaxis es prudente. Estar MUY concentrado al hacer cambios también es una buena idea :-)
¡Entonces! 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. La secuencia de comandos se ejecutará automáticamente cada vez que cree su modelo o realice algunos cambios en el editor de modelos.
Digamos que su descriptor de modelo se llama Model1.edmx . Tendrá un archivo llamado Model1.Context.tt en el árbol debajo de él. También verá un archivo Model1.Context.cs . Obviamente, este es el archivo de código real para su contexto. ¡Pero este archivo es el resultado de la ejecución del archivo de script .tt ! Se crea 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); .. ..
Otras 50 líneas más abajo, el código del constructor se está escribiendo.
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 del constructor.Guarde su archivo y abra el archivo Model1.Context.cs para ver el código resultante. Si desea forzar la ejecución del script de plantilla, seleccione el menú
Es fácil saber si ha cometido un error en su código T4, ya que el archivo .cs no se creará en absoluto o tendrá errores obvios si lo abre en el editor.
fuente