簡體   English   中英

實體框架5添加具有其他外鍵關系的實體和子實體

[英]Entity Framework 5 add entity and child entities with other foreign key relationships

我正在使用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記錄(數量有限)。

我的上下文已將此很好地映射到數據庫,並且正在做大量新記錄的數據插入。 還有另一段代碼用數據填充對象。 這是通過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實體以及子Demo實體, 但是每個子Demo實體都在數據庫中創建了一個新Item而不僅僅是鏈接到現有Item Demo實體沒有Item記錄,它們為空。

我如何確保子Demo實體鏈接到現有的Item記錄,而不是創建新的實體?

整個結構在業務層中設置,並映射( AutoMapper )到所討論的模型。

Item對象位於DbContext.IDbSet<Item>.Local集合中,但需要使用本地集合中的Item對象重置模型中的虛擬Items ,如下所示。

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文檔中的預期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM