0

複数のエンティティ レベルを EF コンテキストに追加しようとすると、オブジェクト参照がオブジェクトのインスタンスに設定されていませんというエラーが発生します。

次の 3 レベルのクラス構造の例を見てください。

public class Forum
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Blog> Blogs { get; set; }
}

public class Blog
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ForumID { get; set; }
    public virtual Forum Forum { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int BlogID { get; set; }
    public virtual Blog Blog { get; set; }
}

特定のフォーラムに対して、新しい投稿を含む新しいブログを追加したいと考えています。

Forum MyForum = context.Forums.Find(1);
Blog MyBlog = new Blog { Name = "My New Blog" };
Post MyPost = new Post { Name = "My New Post" };

MyForum.Blogs.Add(MyBlog); // This WORKS

MyBlog.Posts.Add(MyPost);  // This FAILS

context.SaveChanges();     // We never make it this far

context.SaveChanges()の直後に配置するなど、考えられるすべての注文の組み合わせを試しました.Add(MyBlog)Blog.IDfor を使用する必要がないため窒息しているように見えますPost.BlogIDが、EF はこの状況で使用するための一時的なキー値を生成します。

何か案は?

4

1 に答える 1

0

答え (および根本的な問題) のヒントは、次の場所にあります。

「簡単な」解決策は、Blog.Posts コレクションを手動で初期化することです。

Blog MyBlog = new Blog { Name = "My New Post", Posts = new List<Post>() };

または、2 番目のリンクで Ladislav が推奨するように、このロジックをクラス コンストラクターに組み込むこともできます。

基本的に、新しいオブジェクトを作成すると、コレクションは null になり、List<> として初期化されないため、.Add()呼び出しは失敗します。Forum.Blogs コレクションは、データベース コンテキストから派生するため、遅延読み込みが可能です。ただし、Blog.Posts はゼロから作成され、EF は役に立たないため、コレクションは既定で null です。

于 2013-04-18T21:14:53.230 に答える