9

いくつかの独立したオブジェクトがあり、それぞれに共通のオブジェクトのリストがあります。例えば、

public class Project 
{ 
   public IEnumerable<CommentEntry<Project>> Comments{get;set;}
}
public class Sample
{ 
   public IEnumerable<CommentEntry<Sample>> Comments{get;set;}
}
public class CommentEntry<T> where T: class
{ 
   public int TId {get;set;}
   public int CommentEntryId{get;set;}
   public DateTime TimeStamp{get;set;}
   public string Comment{get;set;}
}

Entity Framework 5 の流暢な API を使用して、プロジェクトとリクエストの CommentEntry テーブルが欲しいです。だから、ここに私のマッピングコードがあります:

modelBuilder.Entity<CommentEntry<Project>>()
            .Map(m =>
                {
                    m.ToTable("EngineeringProjectComments");
                });
        modelBuilder.Entity<CommentEntry<Request>>()
            .Map(m =>
            {
                m.ToTable("SampleRequestComments");
            });

移行を試みると、次のメッセージが表示されます。

タイプ CommentEntry`1[Project]' はマップされませんでした。Ignore メソッドまたは NotMappedAttribute データ注釈を使用して、型が明示的に除外されていないことを確認してください。型がクラスとして定義されていること、プリミティブ、ネスト、またはジェネリックではないこと、および EntityObject から継承されていないことを確認してください。

このコンテキストでジェネリックを使用しようとする私の試みの明らかな欠陥を見ることができます。しかし、多くのクラス間で単一のジェネリック型を共有し、独立したテーブルを持つことを可能にする、データベース テーブル構造、クラス コード、またはマッピング コードの代替案を誰かが提案できますか?

4

1 に答える 1

7

通常の継承構造を使用するだけです。また、EngineeringProjectId のような特定の ID 名を使用する代わりに、Id を使用します。

public class Project 
{ 
   public ICollection<ProjectCommentEntry> Comments{get;set;}
}
public class Sample
{ 
   public ICollection<SampleCommentEntry> Comments{get;set;}
}
public class ProjectCommentEntry : CommentEntry {}
public class SampleCommentEntry : CommentEntry {}
public class CommentEntry
{ 
   public int Id {get;set;}
   public int CommentEntryId{get;set;}
   public DateTime TimeStamp{get;set;}
   public string Comment{get;set;}
}

ところで、EF のナビゲーション プロパティに IEnumerable を使用することはできません。完全なコレクションが必要なため、代わりに ICollection を使用する必要があります。

于 2012-10-16T20:30:52.353 に答える