0

我是 Entity Framework 和 C#/.Net 的新手,正在尝试创建 TPH 继承模型,我不确定我是否应该这样做,所以如果不是,请告知,

这是模型:

 public abstract class Vote
 {
    public int VoteID { get; set; }
    public int UserID { get; set; }
    public bool Value { get; set; }
    public DateTime DateCreated { get; set; }

    public User User { get; set; }
 }

 public class ProjectVote_ : Vote
 {
    public int ProjectID { get; set; }
    public virtual Project Project { get; set; }
 }
 public class CommentVote_ : Vote //There are three more like this, votes for different hings
 {
    public int CommentID { get; set; }
    public virtual Comment Comment { get; set; }
 }

现在的项目模型(评论和模型相似)

public class Project
{
    public int ProjectID { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Vote> Vote { get; set; }
}

发生的情况是 ICollection 创建了一个数据库列 Project_ProjectID 作为 Vote 表中的外键(我认为),而不是使用我定义的 ProjectID。我该如何修复它,或者我应该以不同的方式对其进行建模。如果 fluent API 是修复它的方法,我不知道该怎么做。

最后,我希望能够使用一张表来存储 5 种不同类型的选票。

4

1 回答 1

2

当您拥有相关实体时,您不需要将 FK 存储在模型中的属性。实体框架知道,当它在您的 ProjectVote_ 模型中检测到 Project 时,它需要对 ProjectVote 中的 Project 表进行 FK。与 User 和 UserId 以及 Comment 和 CommentId 相同。您不需要在模型中存储 FK 的属性。

您将获得名称为“Project_ProjectID”的 FK 列,因为实体框架检测到它需要为您的导航属性“Project”创建一个 FK。它使用自己的命名约定来创建列,因此是“Project_ProjectID”。

如果您想在 DBContext 类中为列覆盖 OnModelCreating 提供您自己的名称并添加此流畅映射。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Project>()
        .HasMany(p => p.Vote)
        .HasRequired(v => v.Project) //or .WithOptional(v => v.Project)
        .Map(m => m.MapKey("ProjectId"));  //or any other name you want.
}

对于将来如何使用 Fluent API,这是一个有用的参考。 例如,这里是一些关于如何使用 fluent 自定义 TPH 的文档。

希望有帮助!

于 2013-01-10T02:46:04.107 回答