(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ú
Construir - Transformar todas las plantillas T4
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.