usingbothmany-to-manyandone-to-manysameentityexplained),我想用一对-同一实体的许多关系。问题是EF没有生成正确的数据库架构。代码:publicclassA{publicintId{get;放;}公共字符串名称{得到;放;}公共虚拟ICollectionObjectsOfB{get;放;}}publicclassB{publicintId{get;放;}publicvirtualAObjectA{get;放;}公共虚拟ICollectionOtherObjectsOfA{get;放;当我删除B类的ObjectA属性时,正确生成了多对多关联。如果生成不正确,实体B会得到A的2个外键,而实体A会得到B的1个外键(就像多对一关系一样)。如果您有多个导航属性引用同一个实体,EF不知道另一个实体的反向导航属性属于哪里。在您的示例中:A.ObjectsOfB是指B.ObjectA还是B.OtherObjectsOfA?两者都是可能且有效的模型。现在,EF不会抛出“无法明确确定关系”之类的异常。相反,它决定B.ObjectA引用B的第三个端点,该端点未作为模型中的导航属性公开。这将在表B中创建第一个外键。B的两个导航属性引用A中的两个端点,这两个端点也未在模型中公开:B.ObjectA创建表B的第二个外键,B.OtherObjectsOfA创建一个外键表A的键。要解决此问题,您必须明确指定关系。选项一(最简单的方法)是使用InverseProperty属性:publicclassA{publicintId{get;放;}公共字符串名称{得到;放;}[InverseProperty("OtherObjectsOfA")]publicvirtualICollectionObjectsOfB{get;放;这定义了A.ObjectsOfB是A.ObjectsOfB到B.OtherObjectsOfA的多对多关系。另一种选择是完全在FluentAPI中定义关系:x=>{x.MapLeftKey("AId");x.MapRightKey("BId");x.ToTable("ABs");});modelBuilder.Entity().HasRequired(b=>b.ObjectA)//或HasOptional.WithMany().WillCascadeOnDelete(false);//不确定是否有必要,如果你想要级联删除,你可以试试//如果表B有表A的外键,类B有一个外键到A导航属性,而A必须有ICollection导航属性。如果表B与表A具有多对多关系,则类A必须具有ICollection,类B必须具有ICollection。试试这个,也许这会阐明您对EF的要求。以上就是C#学习教程:同时使用多对多和一对多共享同一个实体的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
