C# 如何修复:关系约束中从属角色和主体角色中的属性数必须相同?
我对SQL Server 2012数据库使用Entity Framework 4.3.1,并使用POCO方法。我发现以下错误,我想知道是否有人可以解释如何修复它: 模型验证异常 在模型生成过程中检测到一个或多个验证错误: \tSystem.Data.Entity.Edm.edmsociationConstraint::关系约束中从属角色和主体角色中的属性数必须相同 没有C# 如何修复:关系约束中从属角色和主体角色中的属性数必须相同?,c#,.net,entity-framework,poco,entity-framework-4.3,C#,.net,Entity Framework,Poco,Entity Framework 4.3,我对SQL Server 2012数据库使用Entity Framework 4.3.1,并使用POCO方法。我发现以下错误,我想知道是否有人可以解释如何修复它: 模型验证异常 在模型生成过程中检测到一个或多个验证错误: \tSystem.Data.Entity.Edm.edmsociationConstraint::关系约束中从属角色和主体角色中的属性数必须相同 没有InnerException可供进一步了解 我无法更改数据库模式,这有点奇怪,但这里是 **是主键(注意,我有复合主键) (F
InnerException
可供进一步了解
我无法更改数据库模式,这有点奇怪,但这里是
- **是主键(注意,我有复合主键)
- (FK)表示外键
错误的原因是模型中的关系配置不正确。这是不正确的:
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的所有列。您还必须将导航属性从Three
删除到One
请注意EF5+:
.HasForeignKey已从EF 5:可用方法列表()中弃用
-枫叶钥匙
-MapRightKey
-易变的
如果一个人需要多对多,其中一个“多”是对一个实体的复合键是:
one.HasKey(t => new { t.TwoId, t.ThreeId });
one.HasRequired(t => t.Two)
.WithMany(s => s.Ones)
.Map(m=>m.MapLeftKey("OneId").MapRIghtKey(new string[]{"TwoId", "ThreeId"}))
这也可能是由以下原因引起的 根据实体框架约定,我引入了几个没有明显关键字段的视图。生成的代码将
[Key]
属性放在了错误的字段中。事实上,它无法检测到任何唯一性,因此它将[Key]
属性放在所有字段上
我能够删除所有额外的键属性以消除错误。太好了,谢谢-我的头撞了一会儿!在我的例子中,我添加了一个
ForeignKey
引用,它与EF在视图上创建的无效复合键
冲突。
using (var ctx = new DbCtx(@"....."))
{
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 });
one.HasKey(t => new { t.TwoId, t.ThreeId });
one.HasRequired(t => t.Two)
.WithMany(s => s.Ones)
.Map(m=>m.MapLeftKey("OneId").MapRIghtKey(new string[]{"TwoId", "ThreeId"}))