1

在 MVC3 Code First EF 中,如何在不创建新实体(多对多)的情况下将一个实体与另一个实体关联?

所以我在class1和class2之间有一个多对多的关系。我需要 class1 来容纳许多 class2,反之亦然。但是,class2 是独立的;我有一个列表,我想单独编辑它们,然后与新的 class1 关联。

当我将我的 class2List 传递给控制器​​(通过 AJAX 和 JSON)时,我检查了 class2 的所有 Id 对应于 db 中的现有 id,即没有创建新的 class2。

模型

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(应该如此),但不是将现有的 class2 与其关联,而是使用新的 Id 创建新的 class2 并将它们添加到数据库中。

我的问题:

这是否与 EF 如何从基类读取我的 Id 属性有关?

我如何能够将几个现有的 class2 作为列表与新的 class1 相关联,而不在数据库中创建新的 class2?

干杯

4

1 回答 1

1

好的,我从弄清楚这一点中学到了两件事:

  • 当我应该实现一个接口时,我是从一个抽象类继承的。如果您有多个具有类似属性(例如“Id”)的实体并且您想要执行类似的操作,这是一个好主意

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

  • 在 EF 中进行关联时,即使 Id 与现有条目匹配,它也不会更新该条目,除非 EF 在上下文中跟踪该条目,如此处所述。我需要做的是:

    • 在映射层中添加一个方法,通过 id 从存储库中获取我想要的条目
    • 将新条目的属性复制到该上下文条目中
    • 返回上下文条目

希望这可以帮助某人

于 2012-06-21T22:10:46.530 回答