当我映射 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。
我在 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。