2017年2月8日水曜日

Entity Framework 1対多

コンソールアプリケーションで試します。
基本的なことはこちら→ConsoleApplicationでCodeFirst


1対多です。
ブログの記事にコメントが複数ぶら下がる状態がまさにそれですね。
イメージしやすいのでこれを題材にいろいろ掘り下げてみます。

まずは、記事のテーブル。
名前と本文だけのシンプルな構成

model/Article.cs
using System.Collections.Generic;

namespace EntityFramework.model
{
    class Article
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }

        //リレーション(相手側が多なのでCollection)
        public virtual ICollection Comment { get; set; }
    }
}


コメントも同様にシンプルな構成
model/Comment.cs
namespace EntityFramework.model
{
    class Comment
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Body { get; set; }

        //リレーション(相手側が1なのでCollectionじゃない)
        public virtual Article Article { get; set; }
    }
}

プレーンなクラスとDBをつなぐクラス
model/BlogContext.cs
using System.Data.Entity;

namespace EntityFramework.model
{
    class BlogContext : DbContext
    {
        public DbSet
Articles { get; set; } public DbSet Comments { get; set; } } }


Add-Migrationして Update-Databaseしてテーブルを作成します。
※こまかいとこはすっとばします。

blogの記事とコメントの関係を考えると
まずは、記事が単独で入って、そのあとにコメントがつくことになると思います。
まず記事を適当に挿入します。



Program.cs
namespace EntityFramework
{
    class Program
    {
        static void Main(string[] args)
        {
            Article article = new Article();
            article.Body = "Body_A";
            article.Title = "Title_A";

            BlogContext db = new BlogContext();
            db.Articles.Add(article);
            db.SaveChanges();
        }
    }
}




今度はコメントがついたので、ID1の記事にコメントを追加します。
Program.cs
using EntityFramework.model;
using System.Collections.Generic;

namespace EntityFramework
{
    class Program
    {
        static void Main(string[] args)
        {
            int articleId = 1;

            BlogContext db = new BlogContext();
            Article article = db.Articles.Find(articleId);

            // 追加の仕方は2通り
            // 記事とコメントの関係は1対多なので
            // 記事につける場合は、コメントは多なのでリストを追加します。
            Comment commentA1 = new Comment { Name = "Name_A1", Body = "Body_A1" };
            Comment commentA2 = new Comment { Name = "Name_A2", Body = "Body_A2" };
            article.Comment = new List { commentA1, commentA2 };
            //↑articleはDBからとったオブジェクト

            // コメントに記事情報を与える場合は、記事は1なので単独でセットします。
            Comment commentA3 = new Comment { Name = "Name_A3", Body = "Body_A3" };
            commentA3.Article = article;
            db.Comments.Add(commentA3);
            // commentA3は、単なるクラスのインスタンス。
            // DBの情報をもったものに登録してあげる必要ある
            // 複数コメントを追加する時は、一つコメントをインスタンスして db.Comments.Addに一つずつ追加すればよい

            db.SaveChanges();
        }
    }
}





今回は、ブログを想定しているので、記事が挿入されてからコメントが追加されましたが、一度に挿入する場合を掲載しておきます。
using EntityFramework.model;
using System.Collections.Generic;

namespace EntityFramework
{
    class Program
    {
        static void Main(string[] args)
        {
            BlogContext db = new BlogContext();

            // 1対多で1側に追加して Contextに追加するパターン
            Article article1 = new Article { Title = "Title_B", Body = "Body_B" };
            Comment comment1 = new Comment { Name = "Name_B", Body = "Body_B" };

            article1.Comment = new List { comment1};
            db.Articles.Add(article1);


            Article article2 = new Article { Title = "Title_C", Body = "Body_C" };
            Comment comment2 = new Comment { Name = "Name_C1", Body = "Body_C1" };
            Comment comment3 = new Comment { Name = "Name_C2", Body = "Body_C2" };

            comment2.Article = article2;
            comment3.Article = article2;

            db.Comments.Add(comment2);
            db.Comments.Add(comment3);

            db.SaveChanges();
        }
    }
}

0 件のコメント:

コメントを投稿