我使用Entity Framework 6.1代码第一个属性定义了以下多对多关系:
public class Many1
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Join> Joins { get; set; }
}
public class Many2
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Join> Joins { get; set; }
}
public class Join
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int ManyOneId { get; set; }
[ForeignKey("ManyOneId")]
[Required]
public virtual Many1 Many1 { get; set; }
public int ManyTwoId { get; set; }
[ForeignKey("ManyTwoId")]
[Required]
public virtual Many2 Many2 { get; set; }
public string Name { get; set; }
}
如您所见,显式提供了外键属性及其导航属性。我可以按如下方式对数据库进行播种:
protected override void Seed(EfTestApp.Model1 context)
{
var one = new Many1 {Name = "one"};
var two = new Many2 { Name = "two" };
var join = new Join
{
Many1 = one,
Many2 = two,
Name = "join",
};
context.Joins.AddOrUpdate(j=>j.Name, join);
context.SaveChanges();
}
这在初始种子上成功,但随后的种子尝试因EntityValidationError而失败。但是,如果我注释掉外键属性并重新生成迁移,则每次播种都会起作用。这看起来很奇怪,因为除了命名差异之外,迁移文件在两者之间看起来几乎相同。为什么这些产生不同的结果?