4

これらは私のクラスです:

public class Post : IPost
{
    public int Id { get; set; }
    public virtual int[] DuplicateOf { get; set; }
    public virtual ICommentInfo[] Comments { get; set; }
}

 public class CommentInfo : ICommentInfo
{
    public virtual string Author { get; set; }
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }

    public virtual int PostId{ get; set; }
    [ForeignKey("PostId")]
    public virtual Post Post { get; set; }
}

このCommentConfigurationをOnModelCreate()に追加すると、次のようになります。

HasRequired(c => c.Post)
            .WithMany(b=>(ICollection<CommentInfo>) b.Comments)
            .HasForeignKey(b=>b.PostId)
            .WillCascadeOnDelete(true);

プロパティCommentsが常にnullである理由と、EFが仮想であるために初期化しない理由を本当に理解できません。遅延読み込みも無効にしようとしましたがcontext.Post.Include("Comments")、エラーのあるナビゲーションプロパティを読み込もうとすると、「コメントというナビゲーションプロパティがありません」と表示されます。そこで、Entity Framework Power Tools Beta 3を使用してエンティティデータモデルを確認しましたが、2つのテーブルの間に関係があり、コメントテーブルの終わりもある場合でも、テーブル「Post」のナビゲーションの終わりがないことがわかりました。

どちらを向いたらいいのかわからないのですが、アレイの問題かもしれませんね?Icollectionプロパティを使用する必要がありますか?Postはインターフェイスを実装しているため、そのプロパティのタイプを変更することはできませんが。

私が見ているすべてのサンプルは明確で、簡単に作業できます。助けてください..よろしくお願いします。

編集:

これは、昨日投稿したリンクを見て変更したものです。

  public class Post : IPost
  {
    public int Id { get; set; }
    public virtual int[] DuplicateOf { get; set; }
    public virtual ICollection<CommentInfo> Comments { get; set; } 
    ICommentInfo[] IPost.Comments { 
      get { return Comments ; } 
      set { Comments = (CommentInfo[])value; } }
  }

例外は次のとおりですSystem.ObjectDisposedException :The ObjectContext instance has been disposed and can no longer be used for operations that require a connection。アプリケーションがコメントを取得しようとすると発生します。キーを削除するvirtualと例外は消えますが、プロパティは常にnullのままであり、値はまったく保持されません。

EDITv2 新しいプロパティを追加する問題を解決し、古いプロパティをそれにマップしました。

public class Post : IPost
{
    public int Id { get; set; }
    public virtual int[] DuplicateOf { get; set; }
    public ICommentInfo[] Comments
    {
        get { return ListComments.ToArray(); }

    }
    public List<CommentInfo> ListComments {get;set;}
}

PostConfiguration OnModelCreate()では、ListCommentsプロパティを次のようなナビゲーションプロパティとして使用しました。

HasMany(b => b.ListComments)
                .WithRequired(c=>c.Post)
                .HasForeignKey(c=>c.PostId)
                .WillCascadeOnDelete(true);

これで完全に機能し、予想よりも単純でした。コメントコレクションを受信しようとすると、「ListComments」プロパティを含めると、Postの配列が取得されます。ご協力ありがとうございました!

4

1 に答える 1

6

コメント内のリンクにアクセスできませんが、変更されたと思います

public virtual ICommentInfo[] Comments { get; set; }

ナビゲーションプロパティを定義する一般的な方法に:

public virtual ICollection<CommentInfo> Comments { get; set; }

エンティティフレームワークは、その概念モデルでインターフェイスをサポートしていないためです。

Post破棄されたコンテキストに関する例外は、データベースからオブジェクトをフェッチしてコンテキストを破棄した後に、このプロパティにアクセスすることを意味します。これにより、データベースへの接続が失われている間、遅延読み込みがトリガーされます。解決策は次を使用することIncludeです:

var posts = context.Posts.Include(p => p.Comments).Where(...)

これで、投稿とコメントが一度に取得されます。

于 2013-02-10T14:54:51.217 に答える