(Використання Visual Studio 2013 або пізнішої версії)
Щоб уникнути редагування конструктора класу у вашій моделі EF кожного разу, коли ви оновлюєте модель з бази даних або іншим способом ініціюєте відновлення коду, правильне місце для зміни - у файлі коду T4, який відповідає за фактично створюючи код моделі. У мене була якась інша проблема з динамічними властивостями ще кілька років тому, коли я зрозумів основну механіку того, як насправді створювались класи та властивості. Т4 !!! Яке це диво: - Синтаксис 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 або взагалі не буде зроблений, або з очевидними помилками, якщо ви відкриєте його в редакторі.