当前位置: 首页 > 编程语言 > C#

如何解决:从属角色和主角色在关系约束中的属性个数必须相同?分享

时间:2023-04-11 00:01:50 C#

如何解决:关系约束中的从属角色和主要角色中的属性数量必须相同?我正在对SQLServer2012数据库使用实体框架4.3.1,并且我正在使用POCO方法。我收到以下错误,我想知道是否有人可以解释如何修复它:ModelValidationException在模型生成期间检测到一个或多个验证错误:tSystem.Data.Entity.Edm.EdmAssociationConstraint::Dependentroleandprimaryinrelationshipconstraint角色中的属性数量必须相同。没有InnerException可用于任何进一步的信息。我无法更改数据库模式,这有点奇怪,但在这里......下面是表格(如果它有助于我发布SQL来生成它们,但我不认为表格实际上是问题,因为例外是在模型的验证中):一-**OneIdintnotnull**TwoIdintnotnull(FK)**ThreeIdintnotnull(FK)Namenvarchar(50)notnullTwo-**TwoIdintnotnull**ThreeIdintnotnull(FK)Namenvarchar(50)notnullThree-**ThreeIdnotnullNamenvarchar(50)notnull这是实体(注意我在模型中包含了外键,但它不是非常标准):publicclassThree{publicintThreeId}publicstringName{get;放;}公共虚拟ICollectionTwos{get;私有集;}公共虚拟ICollectionOnes{get;私有集;}publicvoidAddOne(Oneone){if(one==null)thrownewArgumentNullException("two");if(Ones==null)Ones=newList();如果(!Ones.Contains(one))Ones.Add(one);一.三=这个;}publicvoidAddTwo(Twotwo){if(two==null)thrownewArgumentNullException("two");if(Twos==null)Twos=newList();如果(!Twos.Contains(two))Twos.Add(two);二.三=这个;}}公开课二{publicintTwoId{得到;放;}publicintThreeId{得到;放;}公共字符串名称{得到;放;}publicvirtual三三{get;放;}公共虚拟ICollectionOnes{get;私有集;}publicvoidAddOne(Oneone){if(one==null)thrownewArgumentNullException("two");if(Ones==null)Ones=newList();如果(!Ones.Contains(one))Ones.Add(one);一.二=这个;}}publicclassOne{publicintOneId{get;放;}publicintTwoId{得到;放;}publicintThreeId{得到;放;}publicvirtual二二{get;放;}publicvirtual三三{get;放;}}这是数据上文:publicclassDbCtx:DbContext{publicDbCtx(stringconnectionString):base(connectionString){Ones=Set();两个=设置();三元=设置();}publicDbSetOnes{get;私有集;}publicDbSetTwos{get;私有集;}publicDbSetThrees{get;私有集;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){varone=modelBuilder.Entity();一个.ToTable("一");one.HasKey(d=>new{d.OneId,d.TwoId,d.ThreeId});one.Property(d=>d.OneId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);one.HasRequired(t=>t.Two).WithMany(s=>s.Ones).HasForeignKey(t=>t.TwoId);one.HasRequired(t=>t.Three).WithMany(s=>s.Ones).HasForeignKey(t=>t.ThreeId);vartwo=modelBuilder.Entity();two.ToTable("二");two.HasKey(d=>new{d.TwoId,d.ThreeId});two.Property(p=>p.TwoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);two.HasRequired(t=>t.Three).WithMany(s=>s.Twos).HasForeignKey(t=>t.ThreeId);varthree=modelBuilder.Entity();三.ToTable("三");三.HasKey(s=>s.ThreeId);三.Property(p=>p.ThreeId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);base.OnModelCreating(模型构建器);}}最后,这是导致异常的代码片段:using(varctx=newDbCtx(@".....")){Console.WriteLine(ctx.Twos.Count());}错误的原因是模型中的关系配置不正确这是不正确的:one.HasRequired(t=>t.Two).WithMany(s=>s.Ones).HasForeignKey(t=>t.TwoId);one.HasRequired(t=>t.Three).WithMany(s=>s.Ones).HasForeignKey(t=>t.ThreeId);它应该是:one.HasRequired(t=>t.Two).WithMany(s=>s.Ones).HasForeignKey(t=>new{t.TwoId,t.ThreeId});因为从属FK必须包含主PK的所有列。您还必须从三到一中删除导航属性。EF5+注意:.HasForeignKey已弃用EF5:可用方法列表(https://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.configuration.manytomanyassociationmappingconfiguration_methods(v=vs.103)。aspx)-MapLeftKey-MapRightKey-ToTable如果需要多对多,其中“Many”是具有CompositeKey的实体:one.HasKey(t=>new{t.TwoId,t.ThreeId});one.HasRequired(t=>t.Two).WithMany(s=>s.Ones).Map(m=>m.MapLeftKey("OneId").MapRIghtKey(newstring[]{"TwoId","ThreeId"}))这也可能首先由数据库中的代码引起。按照实体框架约定,我提到了几个没有明显关键字段的视图。生成的代码将[Key]属性放在错误的字段上。事实上,它无法检测到任何唯一性,因此它会将[Key]属性放在所有字段上。我能够删除所有额外的Key属性以使错误消失。以上是C#学习教程:Howtofix:从属角色和主角色在关系约束中的属性个数必须相同?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: