Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修复:关系约束中从属角色和主体角色中的属性数必须相同?_C#_.net_Entity Framework_Poco_Entity Framework 4.3 - Fatal编程技术网

C# 如何修复:关系约束中从属角色和主体角色中的属性数必须相同?

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

我对SQL Server 2012数据库使用Entity Framework 4.3.1,并使用POCO方法。我发现以下错误,我想知道是否有人可以解释如何修复它:

模型验证异常

在模型生成过程中检测到一个或多个验证错误: \tSystem.Data.Entity.Edm.edmsociationConstraint::关系约束中从属角色和主体角色中的属性数必须相同

没有
InnerException
可供进一步了解

我无法更改数据库模式,这有点奇怪,但这里是

  • **是主键(注意,我有复合主键)
  • (FK)表示外键
以下是表(如果有帮助的话,我可以发布SQL来生成它们,但我认为这些表实际上不是问题所在,因为模型验证中存在例外):

以下是实体(请注意,我在模型中包含外键,但不是那个标准):


错误的原因是模型中的关系配置不正确。这是不正确的:

    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"}))