实体框架对导航属性感到困惑

d51*_*512 5 c# entity-framework code-first

我正在使用Entity Framework 6.1.1,我有一个Users表和一个User_Documents表(1:很多).我已经有一个导航属性从User_DocumentsUser了事情正常工作.

public partial class User_Document
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long User_Document_ID { get; set; }

    public long User_ID { get; set; }

    [ForeignKey("User_ID")]
    public virtual User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我从Users添加了一个导航属性到User_Documents

public partial class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long User_ID { get; set; }

    [StringLength(50)]
    public string Username { get; set; }

    public virtual List<User_Document> Documents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我在尝试运行应用程序时遇到错误:

System.Data.Entity.ModelConfiguration.ModelValidationException:在模型生成期间检测到一个或多个验证错误:

User_Documents:Name:EntityContainer中的每个成员名称必须是唯一的.已定义名为"User_Documents"的成员.

当然有一个叫做表User_Documents但没有其他属性的表.我不确定是什么让它感到困惑.也许它将表名称为"User"和属性名称"Documents"并尝试创建一个名为"User_Documents"的东西?如果我将它重命名DocumentsSome_Documents喜欢这样

public virtual List<User_Document> Some_Documents { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后我得到一个不同的错误说明

System.InvalidOperationException:自创建数据库以来,支持'PipeTrackerContext'上下文的模型已更改.考虑使用Code First Migrations来更新数据库

所以我跑了Add-Migration,我得到了这个:

public override void Up()
{
    AddColumn("dbo.User_Documents", "User_User_ID", c => c.Long());
    CreateIndex("dbo.User_Documents", "User_User_ID");
    AddForeignKey("dbo.User_Documents", "User_User_ID", "dbo.Users", "User_ID");
}
Run Code Online (Sandbox Code Playgroud)

为什么要尝试添加一个名为User_User_ID?的新列?为什么我不能Document像我想要的那样添加导航属性?

Ira*_*raj 5

使用InverseProperty像这样:

public partial class User_Document
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long User_Document_ID { get; set; }

    public long User_ID { get; set; }

    [ForeignKey("User_ID")]
    [InverseProperty("Documents")]
    public virtual User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而且:

public partial class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long User_ID { get; set; }

    [StringLength(50)]
    public string Username { get; set; }

    [InverseProperty("User")]
    public virtual List<User_Document> Documents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)