在EF Code First MVC3中将实体关联,而不是创建与多对多关系

时间:2012-06-21 16:26:42

标签: asp.net-mvc-3 entity-framework c#-4.0 ef-code-first dbcontext

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

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

当我将class2List传递给控制器​​(通过AJAX和JSON)时,我检查了所有class2s的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与它相关联,而是使用新的Ids创建新的class2并将它们添加到数据库中。

我的问题:

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

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

干杯

1 个答案:

答案 0 :(得分:1)

好的,我从解决这个问题中学到了两件事:

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

    之类的操作,那么这是一个好主意。

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

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

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

希望这有助于某人