0

Entity Framework (EF) 5 Code First を使用しています。

私は自己参照オブジェクトを持っています。それを呼びましょうDemo:

public class Demo
{
    public int Id; 
    public string Name;
    public Demo Parent;
    public ICollection<Demo> Children;

    public Item Item;
}

これには、別のオブジェクトへの参照がありますItem:

public class Item
{
    public int Id;
    public string Name;
    public Item Parent;
    public ICollection<Item> Children;
}

はい、自己参照でもありますが、これは問題ではありません。データベースには、データベースの移行によってテーブルItem_Idに追加された に基づく外部キーがあります。データベースには一連のレコードDemoが事前に入力されています (限定されたセットです)。Item

私のコンテキストはこれをデータベースにうまくマッピングしており、新しいレコードの大規模なデータ挿入を行っています。オブジェクトをデータで満たすコードがもう 1 つあります。これは、EF を介した実際のインポートです。

public void ImportDemo(IEnumerable<Demo> demos)
{
    var context = this.UnitOfWork.MyApplicationContext;

    foreach (var demo in demos)
    {
        this.DataSet.Add(demo);
        context.Entry(demo).State = EntityState.Added;
    }

    // NOTE: expecting an empty db.
    context.SaveChanges();
}

私の DbModelBuilder には次のものがあります。

    modelBuilder.Entity<Demo>()
                .HasOptional(p => p.Parent)
                .WithMany(p => p.Children);

    modelBuilder.Entity<Item>()
                .HasOptional(p => p.Parent)
                .WithMany(p => p.Children);

エンティティと子エンティティDemoを正常にインポートできますが、各子エンティティは、既存の にリンクするだけでなく、データベースに新しい を作成しています。親エンティティにはレコードがなく、null です。DemoDemoItemItemDemoItem

子エンティティが新しいレコードを作成するのではなくDemo、既存のレコードにリンクしていることを確認するにはどうすればよいですか?Item

4

1 に答える 1

0

構造全体がビジネス層に設定され、問題のモデルにマップ ( AutoMapper ) されます。

Itemオブジェクトはコレクション内にありますが、モデル内のDbContext.IDbSet<Item>.Localダミーは、次のようにローカル コレクション内Itemsのオブジェクトでリセットする必要があります。Item

public void ImportDemo(IEnumerable<Demo> demos)
{
   foreach (var demo in demos)
   {
       foreach (var child in demo.Children)
       {
           child.Item = 
               dbContext.Items.Local.First(p => p.Id == child.Item.Id)
       }

       dbContext.Set<Demo>.Add(demo);
   }

   dbContext.SaveChanges();
}

使用してみAttach()ましたが、MSDN ドキュメントから期待したとおりに動作しませんでした。

于 2013-11-04T14:46:26.827 に答える