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

时间:2015-04-18 18:54:47

标签: 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; }
}

我在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; }
}

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

  

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

     

User_Documents:Name:EntityContainer中的每个成员名称必须是   独特。已定义名为“User_Documents”的成员。

当然有一个名为User_Documents的表,但没有其他具有该名称的属性。我不确定是什么让它感到困惑。也许它将表名称为“User”和属性名称“Documents”并尝试创建一个名为“User_Documents”的东西?如果我将其重命名为Documents 到这样的Some_Documents

public virtual List<User_Document> Some_Documents { get; set; }

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

  

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");
}

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

2 个答案:

答案 0 :(得分: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; }
}

并且:

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; }
}

答案 1 :(得分:0)

  

为什么要添加名为User_User_ID的新列?为什么我不能   只需添加我想要的文档导航属性?

按照惯例,它会将外键创建为 tablename_columnName ,即User_User_ID。当您删除[ForeignKey("User_ID")]属性或没有外键属性时会发生这种情况。

如果您将属性名称Documents更改为其他内容(例如UserDocuments),则不会遇到此名称冲突。