【发布时间】:2011-07-27 19:14:42
【问题描述】:
我有两个这样定义的类:
public class Questionnaire
{
public int QuestionnaireID { get; set; }
public string Title { get; set; }
public bool Active { get; set; }
public virtual ICollection<Question> Questions { get; set; }
public virtual ICollection<Vendor> Vendors { get; set; }
}
public class Vendor
{
public int VendorID { get; set; }
public string VendorName { get; set; }
public virtual ICollection<Questionnaire> OpenQuestionnaires { get; set; }
public virtual ICollection<Questionnaire> SubmittedQuestionnaires { get; set; }
public virtual ICollection<QuestionnaireUser> QuestionnaireUsers { get; set; }
}
我相信这是在这些类之间建立多对多关系的正确方法,并且在构建项目时,我希望创建三个表。
但是,当我尝试将一份问卷与两个不同的供应商关联时,在尝试保存更改时收到以下错误 (context.SaveChanges()):
*违反了多重性约束。关系“QuestionnaireApp.Models.Vendor_OpenQuestionnaires”的角色“Vendor_OpenQuestionnaires_Source”具有多重性 1 或 0..1。*
如果我只将问卷分配给一个供应商,请保存更改,然后将其分配给另一个供应商并再次保存更改,我不再收到错误;然而,问卷仅与分配给它的最后一个供应商相关,这表明(充其量)正在创建一对多关系。
我希望我声明这些类之间的多对多关系的方式有问题,或者我需要在上下文类中添加一些东西来“鼓励”关系,但可能不支持这样的多对多关系,或者无法使用“代码优先”创建?
感谢您的宝贵时间,
杰森
【问题讨论】:
-
我对您使用的任何一种技术都不熟悉,但在 SQL 中,要建立多对多关系,您需要一个桥接表,它与两个表都具有一对多,因此聚合了多对多.我在你的设计中没有看到这样的结构..
-
我认为你需要明确地告诉 EF 这是一个多对多的关系,它引导 EF。
-
一般来说,如果您在每个父对象中都有对应子集合的 ICollection
,EF 将根据约定自动为您生成介入的桥接表。 EF 模型隐藏了干预表。
标签: c# .net entity-framework asp.net-mvc-3 ef-code-first