当我映射 ProjectId 属性 时,代码首先尝试添加 Project_Id 列

Code First trying to add Project_Id column when I have mapped ProjectId Property

我在 VS2013 中使用 EF Code First,无法解决这个问题。
我有以下 类:

项目:

public class Project
{
    public int Id { get; set; }

    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }

    public virtual ICollection<Document> Documents { get; set; }
}  

文档:

public class Document
{
    public int Id { get; set; }
    public string Name { get; set; }

    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }

    public int ProjectId { get; set; }
    public virtual Project Project { get; set; }
}  

当我在控制台中 运行 add-migration xxxx 时,它会显示以下迁移:

    public override void Up()
    {
        DropForeignKey("dbo.Documents", "ProjectId", "dbo.Projects");
        AddColumn("dbo.Documents", "Project_Id", c => c.Int());
        CreateIndex("dbo.Documents", "Project_Id");
        AddForeignKey("dbo.Documents", "Project_Id", "dbo.Projects", "Id");
        AddForeignKey("dbo.Documents", "ProjectId", "dbo.Projects", "Id");
    }  

数据库中已存在 ProjectId 列和 ProjectId FK。

为什么要添加 Project_Id 列?我不想要那个专栏。
我还有其他 classes/Models 并且它们有效。为什么这个要添加额外的列?

添加这个怎么样?

[ForeignKey("ProjectId")]
public virtual Project Project { get; set; }

还有这个?

[InverseProperty("Project")]
public virtual ICollection<Document> Documents { get; set; }

可能需要包含此内容才能使用注释。

using System.ComponentModel.DataAnnotations.Schema;

您也可以使用流畅的 api 而不是数据注释来做到这一点。 Fluent api 让您更好地控制数据注释。

创建一个名为 ProjectMap 的映射 class 并在其中设置关系和属性。

public class ProjectMap : EntityTypeConfiguration<Project>
    {
        public ProjectMap()
        {
            this.Property(pr => pr.CreatedDate).IsRequired(); // If you wish to set a required field
            this.HasMany<Document>(pr => pr.Documents)
                .WithRequired(d => d.Project) // If Project is a required field in Document
                .HasForeignKey(d => d.ProjectId)
                .WillCascadeOnDelete(false); // To disable cascade delete
        }
    }

您可能想要包括

System.Data.Entity.ModelConfiguration

您的映射中的名称空间 class。
使用这个

modelBuilder.Configurations.Add(new ProjectMap());

将您的映射包含在上下文中的 OnModelCreating 方法中 class。