1

在MVC3代碼優先EF如何將一個實體與另一個實體關聯而不創建新實體(多對多)?關聯實體,不創建,與EF代碼中的多對多關係首先MVC3

所以我有一個多對多的class1和class2之間的關係。我需要class1來保存許多class2,反之亦然。但是,class2是獨立的;我有一份他們想要單獨編輯的列表,然後與一個新的class1關聯。

當我將我的class2List傳遞給控制器​​(通過AJAX和JSON)時,我檢查了所有class2s的Ids與db中現有的id相對應,即沒有創建新的class2s。

型號

class 
{ 
    [key] 
    public int Id {set; get;} 
} 
class1 : class 
{ 
     private ICollection<class2> _class2s; 
     public virtual ICollection<class2> class2s 
     { 
      get { return _class2s ?? (_class2s = new HashSet<class2>()); } 
      set { _class2s = value; } 
     } 
} 

class2 : class 
{ 
     private ICollection<class1> _class1s; 
     public virtual ICollection<class1> class1s 
     { 
      get { return _class1s ?? (_class1s = new HashSet<class1>()); } 
      set { _class1s = value; } 
     } 
} 

控制器

public ActionResult SaveChanges(List<class2> class2List) 
    { 
     createNewClass2AndAssociateExistingClass2s(class2List); 
     SaveChangesToDb(); 
     return View("ProductDetail", Model); 
    } 

createNewClass2AndAssociateExistingClass2s(List<class2> class2List) 
{ 
    var newClass1 = newClass1() 
    { 
     class2s = class2List; 
    } 

    ////UnitOfWork allows me to access several DbSets in one transaction 
    unitOfWork.Create(newClass1) 

} 
SaveChangesToDb() 
{ 
    unitOfWork.Commit(); 
} 

這樣做是創建一個新的class1的(因爲它應該),而是在現有class2s與它相關聯的,它使新帶有新ID的class2s並將它們添加到數據庫中。

我的問題:

這是否有EF如何從基類閱讀我的Id屬性呢?

我怎麼能夠將幾個現有的class2s作爲一個列表與一個新的class1相關聯,而無需在數據庫中創建新的class2s?

乾杯

回答

1

好了,所以兩兩件事是我從搞清楚了這一點教訓:

  • 我是從一個抽象類繼承時,我應該已經實現一個接口。這是一個偉大的想法,如果你有一個有類似的性質,如「ID」幾個實體,你想這樣做

    T FindById<T>(int id) where T : IEntity

  • 當EF建立關聯,即使ID匹配現有的條目,它不會更新該條目,除非EF正在上下文中跟蹤該條目,as it says here。我需要做的是:

    • 在按ID獲取的進入,我 從倉庫
    • 複製想要的映射層添加一個方法的新條目的屬性到這方面的條目
    • 返回上下文項

希望這可以幫助別人

相關問題