0

好吧,在一个早上把我的头撞在墙上之后,我把它扔在那里了。

我有一个带有复合 PK(Column1、Column2、Column3)的 DB 表(Table1)。(Column1,Column3) 也是另一个表 (Table2) 的 FK。

尝试使用 Code First EF6 (6.1.3),这是模型:

[Table("DB.Table1")]
public partial class Object1
{
    [Key]
    [Column(Order=0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Column1 { get; set; }

    [Key]
    [Column(Order=1)]
    public byte Column2 { get; set; }

    [Key]
    [Column(Order=2)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Column3 { get; set; }

    public virtual Object2 SecondObject { get; set; }
}

[Table("DB.Table2")]
public partial class Object2
{
    public Object2()
    {
        FirstObjects = new HashSet<Object1>();
    }

    [Key]
    [Column(Order=0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Column1 { get; set; }

    [Key]
    [Column(Order=1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Column3 { get; set; }

    public virtual ICollection<Object1> FirstObjects { get; set; }
}

我的模型构建器(流利的 API):

modelBuilder.Entity<Object1>()
    .HasRequired(o => o.SecondObject)
    .WithMany()
    .HasForeignKey(o => new { o.Column1, o.Column3 });

也许我在 Object2 中缺少 ICollection 的东西?

我收到一条错误消息,提示“从表 Object1 (Column1, Column3) 到表 Object2 (Column1, Column3):: Insufficient mapping: Foreign key must be mapped to some AssociationSet 或 EntitySets 参与外键关联概念方面。”

我试过了:

modelBuilder.Entity<Object1>()
    .HasRequired(o => o.SecondObject)
    .WithMany(o => o.FirstObjects)
    .HasForeignKey(o => new { o.Column1, o.Column3 });

无济于事。我收到“在 Object2 上声明的 FirstObjects 已配置有冲突的外键”错误。

这是从现有数据库生成的 CodeFirst。

4

1 回答 1

0

很快,你的第一个流利的配置

modelBuilder.Entity<Object1>()
    .HasRequired(o => o.SecondObject)
    .WithMany()
    .HasForeignKey(o => new { o.Column1, o.Column3 });

Object2.FirstObjects导航属性一起创建两个额外的列和两个外键,这是不正确的并且会导致问题。

这种模型的正确配置是第二个:

modelBuilder.Entity<Object1>()
    .HasRequired(o => o.SecondObject)
    .WithMany(o => o.FirstObjects)
    .HasForeignKey(o => new { o.Column1, o.Column3 });

但请确保您从新数据库或无数据库开始,因为自动迁移无法正确处理该更改。如果要保留数据库,请注释掉任何Object1Object2配置代码以及相应DbSet的 s。然后更新数据库。(确保Table1并被Table2删除)。然后取消注释Object1Object2相关代码(使用第二个配置!)并更新数据库。现在一切都应该没问题。我是在一个干净的环境中完成的,而且效果很好。

于 2016-04-12T19:07:54.393 回答