使用EFCodeFirst的多对多关系我有两个类定义如下:publicclassQuestionnaire{publicintQuestionnaireID{get;放;}publicstringTitle}publicboolActive{get;放;}公共虚拟ICollection问题{get;放;}公共虚拟ICollection供应商{get;放;}}publicclassVendor{publicintVendorID{get;放;}publicstringVendorName{get;放;}publicvirtualICollectionOpenQuestionnaires{get;放;}publicvirtualICollectionSubmittedQuestionnaires{get;放;}publicvirtualICollectionQuestionnaireUsers{get;一对多关系的正确方法,当我构建项目时,我想要创建三个表。但是,当我尝试将调查问卷链接到两个不同的提供者时,我在尝试保存更改时收到以下错误(context.SaveChanges()):*违反多重约束。“QuestionnaireApp.Models.Vendor_OpenQuestionnaires”关系的“Vendor_OpenQuestionnaires_Source”角色的重数为1或0..1。*如果我只将调查问卷分配给一个供应商,保存更改,然后将其分配给另一个供应商并再次保存更改,我不再收到错误;但是,调查问卷仅与分配给它的最后一个供应商相关联,显示(最多)创建一对多关系。我希望我声明这些类之间的多对多关系的方式有问题,或者我需要添加到上下文类以“鼓励”这种关系,但也许很多这样的-对象关系不受支持,或者不能使用创建的“代码优先”来完成?感谢您抽出时间,Jason如果您没有任何FluentAPI代码,您期望的映射依赖于EFCodeFirst约定。您期望在这里开始的约定是AssociationInverseDiscoveryConvention。现在,如果您查看Intellisense(可能还有文档),它会说这个约定:当相关类型之间只有一对导航属性时,将导航属性检测为彼此相反的约定。现在,问题来了:Questionnaire和Vendor之间没有“一对”导航属性。Vendor有两个引用Questionnaire的集合,而Questionnaire有一个引用Vendor的集合。结果是不应用此约定,EF映射实际上是三个一对多关系,其中只有一端作为导航属性在模型中公开。此外,您希望实现的映射不适用于您的模型:您不能将一端的Questionnaire.Vendors映射到两端的Vendor.OpenQuestionnaires和Vendor.SubmittedQuestionnaires。解决方法是通过以下方式更改模型:publicclassVendor{publicintVendorID{get;放;}publicstringVendorName{get;放;}[NotMapped]publicIEnumerableOpenQuestionnaires{get{returnQuestionnaires.Where(q=>q.IsActive);}}[NotMapped]publicIEnumerableSubmittedQuestnaires{get{returnQuestionnaires.Where(q=>!q.IsActive);}}公共虚拟ICollection问卷{get;放;}publicvirtualICollectionQuestionnaireUsers{get;放;现在Vendor.Questionnaires映射到Questionnaire.Vendors(AssociationInverseDiscoveryConvention应该检测到这一点),帮助程序属性OpenQuestionnaires和SubmittedQuestionnaires允许您提取选定的项目。(我不确定IsActive是否是您的区分标志。否则您将不得不引入一些新标志。)[NotMapped]属性在那里使其明确。这可能没有必要,因为EF无论如何都不会映射IEnumerable集合和只读属性。去看看,经过一个小时左右的搜索,我在发布问题后30秒找到了准确答案。解决方案是将以下内容添加到上下文类中:modelBuilder.Entity().HasMany(x=>x.OpenQuestionnaires).WithMany(x=>x.Vendors).Map(x=>{x.MapLeftKey("vID");x.MapRightKey("qID");x.ToTable("VendorQuestionnaires");});看了这篇StackOverflow的帖子找到了答案:EFCodeFirstmany-to-manynotworking以上是C#学习教程:使用EFCodeFirst的多对多关系共享的所有内容,如果有用你和你需要了解更多的C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击权利联系管理会员删除。如需转载请注明出处:
