0

抽象型から選択して実装型の関係エンティティを含めるときに .Include() を使用する方法を理解しようとしています。これは、私がやろうとしていることの例です:

[Table("Comments")]
public abstract class Comment
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CommentId { get; set; }
    public int UserId { get; set; }
    public virtual UserProfile User { get; set; }
    public string Content  { get; set; }
}

[Table("PostComments")]
public class PostComment : Comment
{
    public int PostId { get; set; }
    public virtual Post Post { get; set; }
}

[Table("UserProfiles")]
public class UserProfile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    [MaxLength(200)]
    public string UserName { get; set; }
    public ICollection<Comments> Comments { get; set; }
}

  using (DataContext db = new DataContext())
  {
       return db.UserProfiles.Include(x => x.Comments)
       .Single(u => u.UserId == WebSecurity.CurrentUserId);

       // Here I need a way to include Comment.Post if Comment 
       // is PostComment or some other child entity if Comment is 
       // from another inherited type

  }
4

1 に答える 1

1

このようにすることはできません。別のアプローチが適切に機能する場合があります。

これに変更UserProfileします。

[Table("UserProfiles")]
public class UserProfile
{
    // ...
    public ICollection<PostComment> PostComments { get; set; }
    public ICollection<OtherComment> OtherComments { get; set; }
}

共通の型を継承するときに EF が行うことは、共有テーブルに識別子列を作成することです。したがって、 を選択するPostCommentsと、EF が生成する WHERE 句は次のようになりAND type='PostComment'ます。(それが生成する列の名前は覚えていませんが、アイデアはわかります)。

次に、次のようなデータを取得できます。

var data = db.UserProfiles
                .Include("PostComments.Post")
                .Include("OtherComments.OtherData")
                .Single(p => p.UserId == WebSecurity.CurrentUserId);

すべてのコメントを 1 つのリストとして使用する場合は、次のように作成できます。

var comments = data.PostComments.ToList<Comment>();
comments.AddRange(data.OtherComments);
于 2013-08-07T08:57:47.197 に答える