2012-04-27 11 views
0

標準の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) #>)] 
<#+ 
    } 
} 

希望に役立ちます!

答えて

1

AddressIdがリレーションのFKとして処理されないため、BillingAddressが正しくマップされていないようです。

は、あなたのナビゲーションプロパティにこの属性を追加してください:

[ForeignKey("AddressId")] 
public Address BillingAddress { get;set; } 

あなたが最初に正しくこれらのクラス間の関係が設定されていることを確認して、データベースとEDMXを使用している場合。 EFはストアマッピングでこの情報を使用し、ストアマッピングは操作のシーケンスを定義します。関係エンティティが正しく設定されていない場合は、タイプ名のアルファベット順で処理されます。=>AccountAddressより前に処理されます。

Btw。 コール中にAccountが重複していないことを確認してください。

+0

@Ladislavの提案に感謝します。 ForeignKey属性を設定するためにT4テンプレートを更新しました。これは問題を修正したようです - アドレスのINSERTがアカウントのUPDATEの前に発生し、新しく生成された主キーが外部キー列に追加されます。興味がある人は、元の質問をT4コードで更新します。 –

関連する問題