これらは私のクラスです:
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の配列が取得されます。ご協力ありがとうございました!