实体框架代码首先添加额外的外键

时间:2016-05-27 09:55:51

标签: entity-framework ef-code-first foreign-keys ef-migrations

我对EF Code First方法完全陌生,我面临有关我的表Histories的迁移结果的问题。

我希望Histories表有一个User外键(0 .. *关系:用户可以没有或多个历史记录):

public partial class User
{
    public User()
    {
        this.Histories = new HashSet<History>();
    }

    public System.Guid Id { get; set; }

    [InverseProperty("User")]
    public virtual ICollection<History> Histories { get; set; }
}

public partial class History
{
    public History()
    {
    }

    public System.Guid Id { get; set; }
    public System.Guid UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }
}

然而,这次迁移会导致额外的外键User_Id,无论我尝试什么,我都无法阻止它被创建。

CreateTable(
            "dbo.Histories",
            c => new
                {
                    Id = c.Guid(nullable: false),
                    UserId = c.Guid(),
                    User_Id = c.Guid(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.Users", t => t.UserId)
            .ForeignKey("dbo.Users", t => t.User_Id)
            .Index(t => t.UserId)
            .Index(t => t.User_Id);

我正在使用Data Annotations,但也尝试使用OnModelCreating方法,但未成功。

我阅读了很多帖子,特别是这个帖子(http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx),但找不到合适的解决方案。

有人请你解释一下我做错了什么以及我错过了什么?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我终于弄清楚发生了什么。实际需要InverseProperty,否则会创建更多额外的外键,但问题是由于User其他部分类中的此属性:

public List<History> History
    {
        get
        {
            return Histories.OrderByDescending(h => h.Clock).ThenBy(h => h.Type).ToList();
        }
    }

添加[NotMapped]属性可以防止额外的外键被添加 我不知道没有set的属性会被视为列,但看起来就是这种情况并导致了这个问题。

答案 1 :(得分:0)

您可以这样使用流畅的API:

modelBuilder.Entity<History>().HasRequired(x=> x.User).WithMany(x=> x.Histories).HasForeignKey(x=> x.UserId);
modelBuilder.Entity<User>().HasMany(x=> x.Histories).WithRequired(x=> x.User).HasForeignKey(x=> x.UserId);

没有setter的属性与[NotMapped]属性具有相同的行为。