2011-08-08 14 views
1

私はEF4.1コードファーストを使用しています。私は、関連するエンティティIDを保存するための非常に簡単な挿入を取得することはできません。生成されたSQLは、関連するエンティティに対して常にNULLを挿入します。コードの例を以下に示します。誰も私がここで間違っているのを見ることができますか?文字列などのエンティティ以外のプロパティを正しく挿入します。また、DBイニシャライザクラスに類似のコードがあり、テストデータをシードするとうまくいくようです。EF4.1コード最初に関連エンティティを持つエンティティを追加

 using (var ctx = new DataContext()) 
     { 
      ctx.Users.Attach(existingUser); 

      // create item and add to context 
      var newItem = new MyItem(); 
      ctx.MyItems.Add(newItem); 

      // set related entity 
      newItem.CreatedBy = existingUser; 

      ctx.SaveChanges(); 
     } 

答えて

1

コードは、DbContextのデフォルト設定で動作するはずです。この場合、

public DataContext() 
{ 
    this.Configuration.AutoDetectChangesEnabled = false; 
} 

EFは、ナビゲーションプロパティの変更を検出しませんnewItem.CreatedBy:それは動作しないことを一つの可能​​な説明は、あなたのコンテキストのコンストラクタでのようなものを持っている場合たとえば、あなたが自動変更検出が無効になっているということです新しい項目をコンテキストに追加した後(変化検出が無効になっていない場合SaveChangesは、この最後の変更を検出します。)

あなたがコンテキストに新しい項目を追加する前に、ナビゲーションプロパティを設定すると起こるように、あなたはあなたのコードを変更することができます。

using (var ctx = new DataContext()) 
{ 
    ctx.Users.Attach(existingUser); 

    // create item and add to context 
    var newItem = new MyItem(); 

    // set related entity 
    newItem.CreatedBy = existingUser; 

    ctx.MyItems.Add(newItem); 

    ctx.SaveChanges(); 
} 

この自動変更検出の有無にかかわらず動作するはずです。

+0

私は本当に変更検出をfalseに設定しました。上記のようにコードを移動すると、問題が解決されました。助けてくれてありがとう。私は、プロパティを変更したことを示すための何らかの方法もなければならないと思いますか?既存のエンティティを更新する場合はどうでしょうか? –

+0

'ctx.Entry(existingItem).State = EntityState.Modified'は、既存のエンティティが接続されている場合の解決策です。 –

+0

@Barry:状態を手動で「Modified」に設定すると、* full * SQL文が更新されることに注意してください。*すべてのプロパティは、実際に変更されたかどうかに関係なく、サーバーに送信されます。多くの場合、元のオブジェクトをDBから取得し、変更されたプロパティをそのオブジェクトにマージする方がパフォーマンスが向上します。 EFはこれらの変更を追跡し、実際に変更されたプロパティを持つ更新コマンドのみを送信します。 – Slauma

0

これを試してみてください:

using (var ctx = new DataContext()) 
{ 
    ctx.Users.Attach(existingUser); 

    // create item and add to context 
    var newItem = new MyItem(); 
    ctx.MyItems.Add(newItem); 

    // set related entity 
    newItem.CreatedBy = existingUser; 

    // Added 
    ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy, EntityState.Added); 

    ctx.SaveChanges(); 
} 

をそれは、仕事で行を変更しない場合は、次の

ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy、EntityState.Modified)。

1行追加...希望します。

関連する問題