標準のT4テンプレートを使用してDbContextとPOCOを生成するEF 4.2とデータベースファースト開発を使用するアプリケーションで作業しています。保存時に親オブジェクトにアソシエートされていないエンティティ
public void Save(Account updated)
{
var existing = DbContext.Find(updated.AccountId);
MyContext.Entry(existing).CurrentValues.SetEntry(updated);
existing.Address = updated.Address;
MyContext.SaveChanges();
}
SQL Serverプロファイラを見て、私は見ることができます:
public class Address
{
public int AddressId { get;set; }
public string Address1 { get;set; }
public string City { get;set; }
}
public class Account
{
public int AccountId { get;set; }
public string Name { get;set; }
public int AddressId { get;set; }
public Address BillingAddress { get;set; }
}
私は、既存のアカウントの請求先住所を作成し、私のコードは次のようなものです:T4テンプレートはエンティティにこのような何かを生成します住所入力がデータベースに挿入されていますが、残念ながら、の後にが発生していますので、そのアカウントは親アカウントから切り離されており、次にアカウントを読み込むと、
問題を回避するには、SaveChangesメソッド()の呼び出しの後、次のコードを追加することである:
それが動作する可能性がありながら、データベースへの第2のSQLの更新を必要とし、エンティティとして成長し、加算、if (existing.AddressId == null && existing.Address != null)
{
existing.AddressId = existing.Address.AddressId;
MyContext.SaveChanges();
}
より多くの団体は、より多くのハッキングを必要とします。私が行方不明になっていることは明らかですか?以下ラディスラフの答えに続き
** UPDATE ** 、私は私のT4テンプレートにWriteNavigationPropertyで次のメソッドの呼び出しを追加しました:
void WriteKeyAttribute(CodeGenerationTools code, NavigationProperty navigationProperty, MetadataTools ef)
{
var dependentProperties = navigationProperty.GetDependentProperties();
if (dependentProperties.Any())
{
var keys = new List<string>();
foreach (var key in dependentProperties)
{
keys.Add(String.Format("\"{0}\"", key.Name));
}
#>
[ForeignKey(<#= String.Join(", ", keys) #>)]
<#+
}
}
希望に役立ちます!
@Ladislavの提案に感謝します。 ForeignKey属性を設定するためにT4テンプレートを更新しました。これは問題を修正したようです - アドレスのINSERTがアカウントのUPDATEの前に発生し、新しく生成された主キーが外部キー列に追加されます。興味がある人は、元の質問をT4コードで更新します。 –