在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相关联?
干杯
答案 0 :(得分:1)
好的,我从解决这个问题中学到了两件事:
当我应该实现一个接口时,我继承了一个抽象类。如果您有多个具有类似属性的实体(例如“Id”)并且您想要执行类似
之类的操作,那么这是一个好主意。 T FindById<T>(int id) where T : IEntity
在EF中进行关联时,即使Id与现有条目匹配,它也不会更新该条目,除非EF在上下文中跟踪该条目as it says here。我需要做的是:
希望这有助于某人