(Visual Studio 2013以降を使用)
データベースからモデルを更新するたびにEFモデルのクラスコンストラクターが編集されないようにするため、またはその他の方法でコードの再構築をトリガーするために、変更を行う適切な場所は、責任のあるT4コードファイルです。実際にモデルコードを作成します。数年前、クラスとプロパティが実際にどのように作成されたかの基礎となるメカニズムを理解したときに、動的プロパティに関する他の問題が発生しました。T4 !!! それはなんと奇跡なのでしょう:-DT4構文は最初は少し威圧的かもしれないので、構文を読むのは賢明です。変更を加えるときに非常に集中することも良い考えです:-)
そう!モデルを見ると、.edmxファイルの下に.ttファイルがあります。この.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テンプレートを変換します
.csファイルはまったく作成されないか、エディターで開いた場合に明らかなエラーが発生するため、T4コードを間違えたかどうかを簡単に知ることができます。