(Используя Visual Studio 2013 или новее)
Чтобы избежать редактирования конструктора класса в вашей модели EF каждый раз, когда вы обновляете модель из базы данных или каким-либо другим способом запускаете перестроение кода, правильное место для внесения изменений находится в файле кода T4, который отвечает за собственно создание кода модели. Несколько лет назад у меня была еще одна проблема с динамическими свойствами, когда я понял основную механику создания классов и свойств. Т4 !!! Какое это чудо: -D Синтаксис T4 поначалу может показаться немного пугающим, так что читать о синтаксисе целесообразно. ОЧЕНЬ сосредоточиться при внесении изменений - тоже хорошая идея :-)
Так! Если вы посмотрите в свою модель, у вас есть файл .tt под вашим файлом .edmx. Этот файл .tt (T4) представляет собой сценарий, который фактически создает класс вашей модели. Скрипт будет запускаться автоматически каждый раз, когда вы создаете модель или вносите какие-либо изменения в редактор модели.
Допустим, ваш дескриптор модели называется Model1.edmx. У вас будет файл с именем Model1.Context.tt в дереве под ним. Вы также увидите файл Model1.Context.cs. Очевидно, что это фактический файл кода для вашего контекста. Но этот файл является результатом запуска файла сценария .tt! Он полностью динамически создается. Так что не знаю, редактировать это.
Откройте файл .tt, и вы увидите что-то вроде:
<#@ 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);
..
..
Еще примерно на 50 строк ниже код конструктора пишется.
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;
<#
}
Я добавил свойство base.Configuration.ProxyCreationEnabled = false;, чтобы оно было самой первой строкой в конструкторе.
Сохраните файл и откройте файл Model1.Context.cs, чтобы увидеть полученный код. Если вы хотите принудительно запустить сценарий шаблона, выберите меню
Сборка - преобразование всех шаблонов T4
Легко узнать, допустили ли вы ошибку в своем коде T4, так как файл .cs будет либо вообще не создан, либо с очевидными ошибками, если вы откроете его в редакторе.
person
Per Malmstedt
schedule
27.10.2017