0

私はEntityFrameworkと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は、私が定義したProjectIDを使用する代わりに、Voteテーブルの外部キーとしてデータベース列Project_ProjectIDを作成します(私は思います)。どうすれば修正できますか、または別の方法でモデル化する必要があります。流暢なAPIがそれを修正する方法である場合、私はそれを行う方法がわかりません。

最終的には、1つのテーブルを使用して5種類の投票を保存できるようにしたいと思います。

4

1 に答える 1

2

関連するエンティティがある場合、モデルにFKを格納するためのプロパティは必要ありません。Entity Frameworkは、ProjectVote_モデルでProjectを検出したときに、ProjectVoteのProjectテーブルにFKを作成する必要があることを認識しています。UserとUserId、CommentとCommentIdについても同じです。モデルにFKを格納するプロパティは必要ありません。

エンティティフレームワークがナビゲーションプロパティ「Project」のFKを作成する必要があることを検出しているため、「Project_ProjectID」とは異なる名前の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.
}

そして将来的には、これはFluentAPIの使用方法に関する役立つリファレンスです。 たとえば、ここに流暢にTPHをcustimizeする方法に関するいくつかのドキュメントがあります。

お役に立てば幸いです。

于 2013-01-10T02:46:04.107 に答える