使用Entity Framework 6.2时出现验证错误。该代码是使用现有数据库中的“代码优先”生成的。主键和外键都是复合的和使用的版本。该代码已经过清理,只显示了相关部分。看起来它正在尝试交换版本和ID值。任何建议将不胜感激。
public partial class MyParent
{
public MyParent()
{
MyChild = new HashSet< MyChild >();
}
[Key]
[Column(Order = 0)]
[StringLength(50)]
public string MyID { get; set; }
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int MyVersion { get; set; }
}
public partial class MyChild
{
[Key]
[Column(Order = 0)]
[StringLength(50)]
public string ChildID { get; set; }
[Required]
[StringLength(50)]
[ForeignKey("MyParent) Column(Order = 1)]
public string MyID { get; set; }
public string NextChild { get; set;}
[Key]
[Column(Order = 2)]
[ForeignKey("MyParent")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int MyVersion { get; set; }
public virtual MyParent MyParent { get; set; }
public virtual ICollection<MyChild> MyChilds1 { get; set; }
public virtual MyChild MyChild1 { get; set; }
}
public partial class MyContext : DbContext
{
public MyContext()
: base("name= MyContext ")
{
}
public MyContext (string connectionString) : base(connectionString)
{
}
public virtual DbSet<MyParent> MyParent { get; set; }
public virtual DbSet<MyChild> myChild { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyParent>()
.HasMany(e => e.MyChild)
.WithRequired(e => e.MyParent)
.HasForeignKey(e => new { e.MyID, e.MyVersion })
.WillCascadeOnDelete(false);
modelBuilder.Entity<MyChild>()
.HasMany(e => e.MyChilds1)
.WithOptional(e => e.MyChild1)
.HasForeignKey(e => new { e.ChildID, e.MyVersion });
}
}
错误:
“在模型生成期间检测到一个或多个验证错误:MyParent_MyChild ::引用约束的从属角色中的所有属性的类型必须与主体角色中相应的属性类型相同。MyVersion属性的类型
上的实体'MyChild'与引用约束'MyParent_MyChild'中的实体'MyParent'的属性'MyID'不匹配。MyParent_MyChild:引用约束的“从属角色”中所有属性的类型必须与“主体角色”中相应的属性类型相同。在引用约束“ MyParent_MyChild”中,实体“ MyChild”的属性“ ChildID”的类型与实体“ MyParent”的属性“ MyVersion”的类型不匹配。
我为简单情况添加了修复程序。它是添加ForeignKey标签并调整列顺序。这不适用于更复杂的模型,即自引用表(NextChild)。
新错误:
$ exception {“在类型'MyChild.MyChilds1上声明的导航属性'MyChild'已配置有冲突的外键。”} System.InvalidOperationException
外键的db代码为:
[PK_MyChild] PRIMARY KEY CLUSTERED ([ChildID] ASC, [MyVersion] ASC),
[FK_MyChild_MyParent] FOREIGN KEY ([MyID], [MyVersion]) REFERENCES [dbo].[MyParent]([MyID], [MyVersion]),
[FK_MyChild_MyChild] FOREIGN KEY ([NextChild], [MyVersion]) REFERENCES [dbo].[MyChild] ([ChildID], [MyVersion])