EF多对多关系仅在暴露外键属性时才会产生错误

时间:2014-07-21 16:38:18

标签: c# entity-framework many-to-many entity-framework-6

我使用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而失败。但是,如果我注释掉外键属性并重新生成迁移,则每次播种都会起作用。这看起来很奇怪,因为除了命名差异之外,迁移文件在两者之间看起来几乎相同。为什么这些产生不同的结果?

0 个答案:

没有答案