C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ASP.NET MVCでのテーブル結合


(過去ログ 139 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■81174 / inTopicNo.1)  ASP.NET MVCでのテーブル結合
  
□投稿者/ しーしゃーぷ (3回)-(2016/08/31(Wed) 16:08:47)

分類:[ASP.NET (C#)] 

お世話になっております。

VisualStudio 2013でASP.NET MVC5(C#、Razor)アプリケーションを勉強中です。

サイト
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_03/aspnetmvc3_03_01.html

書籍
https://www.amazon.co.jp/dp/4798041793
を見て試しに人物データベースを作っております。

ビューやコントローラー、モデルの役割などは分かってきたのですが、
一つ、モデルの結合が分からなくて困っております。

DBはコードファーストで作成しておりまして、モデルは
・Cast → 人物マスタ
・Agency → 所属事務所
があり、以下のように作成してます。

■モデル
//人物TB
public class Cast
{
[Key]
public int CastId { get; set; }
public string CastName { get; set; }
public int? AgencyId { get; set; }
public int? BloodId { get; set; }
}

//所属事務所TB
public class Agency
{
[Key]
public int AgencyId { get; set; }
public string AgencyName { get; set; }
}

//血液型TB
public class Blood
{
[Key]
public int BloodId { get; set; }
public string BloodName { get; set; }
}

//DBコンテキスト
public class CastDbContext : DbContext
{
public DbSet<Cast> Casts { get; set; } // Castsテーブル
public DbSet<Agency> Agencies { get; set; } // Agenciesテーブル
public DbSet<Blood> Bloods { get; set; } // Bloodsテーブル
}


コントローラーは以下です。
■コントローラー
private CastDbContext _db = new CastDbContext();

public ActionResult Index(string keyword = "")
{
IQueryable<CastView> result = from c in this._db.Casts
join a in this._db.Agencies
on c.AgencyId equals a.AgencyId
into a2
join r in this._db.Bloods
on c.BloodId equals r.BloodId
into r2
from list1 in a2.DefaultIfEmpty()
from list2 in r2.DefaultIfEmpty()
orderby c.CastId
select new CastView
{
CastId = c.CastId,
CastName = c.CastName,
AgencyName = (list1.AgencyName == null ? string.Empty : list1.AgencyName),
BloodName = (list2.BloodName == null ? string.Empty : list2.BloodName)
};

result = result.Where(c => c.CastName.Contains(keyword));

return View(result);

}

こんな感じで、結果的には動いているのですが、
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_03/aspnetmvc3_03_01.html
で見ると、モデル内で、
public virtual ICollection<Review> Reviews { get; set; }
といった形で、1:多のリレーションを貼っているように見えます。

上記のようにLinqで結合して抽出するやり方がネット上では多く感じたのですが、
Linqの場合、詳細ページを表示するのにも同じLinqを書かなければならないのが非効率な気がしてます。
(抽出ロジックだけ分離すれば良いのかもしれませんが。)

もしこれでテーブル結合のようなものが可能なのであれば、
上記、AgencyNameやBloodNameもモデルとビューの書き方だけで結合が可能な気がします。


そこで質問なのですが、
@AgencyNameやBloodNameのように、マスタからIDで紐づけて名称を取得するような
モデルの書き方はどのようになるのでしょうか?

Apublic virtual ICollection<Review> Reviews { get; set; }
のように1:多の場合で多の情報をビューで表示するのはどのように記述するのでしょうか?


何が一般的か分からず、、
やり方もしくは参考サイトなど教えて頂けますと助かります。
宜しくお願いします。
※漏れている情報があればご指摘ください。


引用返信 編集キー/
■81179 / inTopicNo.2)  Re[1]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1014回)-(2016/08/31(Wed) 17:55:37)
No81174 (しーしゃーぷ さん) に返信

> @AgencyNameやBloodNameのように、マスタからIDで紐づけて名称を取得するような
> モデルの書き方はどのようになるのでしょうか?

参考にされている atmarkit の記事にあるようにナビゲーション・プロパティを使えば
よいと思います。

DB がどのように生成されるかは以下の記事を見てください。

MVC4 EF Code First
http://surferonwww.info/BlogEngine/post/2014/12/20/aspnet-mvc4-entity-framework-code-first.aspx

#上の記事で、ナビゲーション・プロパティに atmarkit の記事の ICollection<T> では
なくて IList<T> を使っているのは理由があって、モデルバインディングがうまく行かな
いからです。そのあたりに興味があれば以下の記事を見てください。

親子関係のあるデータ登録
http://surferonwww.info/BlogEngine/post/2014/12/21/create-relational-data-in-parent-and-child-tables-of-sql-server-database.aspx

親子関係のあるデータの編集・削除
http://surferonwww.info/BlogEngine/post/2014/12/22/edit-and-delete-relational-data-in-parent-and-chilid-tables-of-sql-server-database.aspx


> Apublic virtual ICollection<Review> Reviews { get; set; }
> のように1:多の場合で多の情報をビューで表示するのはどのように記述するのでしょうか?

参考にされている atmarkit の記事に、

"また、ナビゲーション・プロパティがvirtualキーワードで修飾されている点にも注目だ。
エンティティ上でvirtualキーワードの付いたプロパティは、それが遅延ロードされること
を表す。つまり、明示的に該当するプロパティにアクセスするまで、参照先の値(ここで
は関連付いたReviewsテーブルの値)はデータベースから取得されない"

と書いてあるのは読みましたか? そこがポイントです。

それは逆に言えばナビゲーション・プロパティにアクセスすれば DB から関連する(FK で
リレーションが付けられた)Reviews テーブルのレコードを取得しに行くということです。

なので、その記事の Page 3 に書いてあるように、Controller で、

private MyMvcContext db = new MyMvcContext();
 
  ……中略……
 
public ViewResult Index()
{
   return View(db.Books.ToList());
}

のようにして IEnumerable<MvcApp.Models.Book> を作って View に渡せば、View から
ナビゲーション・プロパティにアクセスすると、関連する Reviews テーブルのレコード
を取得できます。

記事の Page 3 の View のコードでは Books テーブルのレコードしか取得していません
が、以下のようにナビゲーション・プロパティにアクセスすることによって Books テー
ブルのレコードに関連する Reviews テーブルのレコードを取得できます。

@model IEnumerable<MvcApp.Models.Book> 

  ……中略……

@foreach (var item in Model) { 

  ……中略……

    foreach (var review in item.Reviews) { 

      ……中略……

        Html.DisplayFor(model => review.ReviewId)

      ……中略……
    }

}
……後略……

引用返信 編集キー/
■81182 / inTopicNo.3)  Re[2]: ASP.NET MVCでのテーブル結合
□投稿者/ しーしゃーぷ (4回)-(2016/09/01(Thu) 10:38:35)
No81179 (WebSurfer さん) に返信

返信ありがとうございます。
教えて頂いた内容と、@ITの記事を何度も読み返すうちに、動きが分かってきました。

一点分からないのが、
ICollection<T> で参照・取得しようとしているモデルとの
紐づけは、同じフィールド名で自動的に行われると考えて良いのでしょうか?
(@ITの1ページのモデルでいうと、BookモデルのTitleフィールドと、ReviewモデルのTitleフィールドのように。)
その場合、仮にInsDate(登録日)というようなフィールドが両方のモデルに存在した場合、
TitleとInsDateの両方で紐づいてしまうことは無いのでしょうか?(逆に同じフィールド名が無いとか。)


それと、追加の質問で恐縮ですが、
最初の質問のモデルで、今度は「多対多」の情報を扱おうと
以下の通り「人物TB」を修正し、「作品TB」「人物・作品紐づけ中間TB」を追加しました。
人物が何の作品に出演しているかを表示する目的です。

■モデル
//人物TB
public class Cast
{
[Key]
public int CastId { get; set; }
public string CastName { get; set; }
public int? AgencyId { get; set; }
public int? BloodId { get; set; }
}

//作品TB
public class Title
{
[Key]
public int TitleId { get; set; } // タイトルID
public string TitleName { get; set; } // タイトル名
}

//人物・作品紐づけ中間TB
public class CastTitles
{
[Key]
public int CastId { get; set; }
[Key]
public int TitleId { get; set; }

public virtual ICollection<Title> Titles { get; set; }

}

この状態で、一度実行してみたところ、
「'CastTitles' の複合主キーの順序を特定できません。」
とエラーになりました。
その為、
CastTitlesの[Key]をそれぞれ[Key, Column(Order = 0)]、[Key, Column(Order = 1)]としたのですが、今度は、
「型または名前空間名 'Column' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」
とビルドエラーになりました。

Column属性の名前空間等の追加が必要なのでしょうか?
(ちなみにEntity Frameworkバージョンは6.1.3です。)




引用返信 編集キー/
■81192 / inTopicNo.4)  Re[3]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1015回)-(2016/09/01(Thu) 17:39:11)
No81182 (しーしゃーぷ さん) に返信

> ICollection<T> で参照・取得しようとしているモデルとの
> 紐づけは、同じフィールド名で自動的に行われると考えて良いのでしょうか?
> (@ITの1ページのモデルでいうと、BookモデルのTitleフィールドと、ReviewモデルのTitleフィールドのように。)

「紐づけ」とはどういうことを言っているのか分かりませんので以下のレスは外しているかも
しれませんが・・・

Book クラスの Title プロパティと、Review クラスの Title プロパティは別物で、それらの
プロパティを使って設定・取得できるのも別物というのは理解されてますうよね。

Book クラスの Reviews プロパティからは Review クラスのコレクションが設定・取得できる
のも理解されてますよね。

なので、例えば以下のようなコードで Review を子に持つ Book オブジェクトを作れるのは分
かりますよね。

int number = 2

Book book = new Book();
book.Isbn = "978-4-7980-2401-1";
book.Title = "ASP.NET MVC 実践プログラミング";
book.Price = 3200;
book.Publish = "秀和システム";
book.Published = new DateTime(2009, 10, 25);

book.Reviews = new List<Review>();

for (int i = 0; i < number; i++)
{
    Review review = new Review();
    review.Title = "タイトル " + i.ToString();
    review.Body = "本文 " + i.ToString();
    review.CreatedAt = DateTime.Now;

    book.Reviews.Add(review);
}

View から送られてきた POST データからモデルバインディングによって上記のような形で
Book オブジェクトを作り、それを Conntroller のアクションメソッドに渡してやれば、以
下のようにして DB に INSERT できるのは分かりますでしょうか?

private MyMvcContext db = new MyMvcContext();

 [HttpPost]
public ActionResult Create2(Book book)
{
    if (!ModelState.IsValid)
    {
        return View(book);
    }

    db.Books.Add(book);

    for (int i = 0; i < book.Reviews.Count; i++)
    {
        db.Reviews.Add(book.Reviews[i]);
    }
    db.SaveChanges();

    return RedirectToAction("Index");
}

上記のデータを表示するには以下のようにすればいいというのは分かりますでしょうか?

public ActionResult Details(string isbn)
{
    Book book = db.Books.Find(isbn);
    if (book == null)
    {
        return HttpNotFound();
    }
    return View(book);
}


@model Mvc4App2.Models.Book

@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Details</h2>

<fieldset>
    <legend>Book</legend>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Isbn)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Isbn)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Title)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Title)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Price)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Price)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Publish)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Publish)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Published)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Published)
    </div>

    <h3>Reviews</h3>
    @foreach (var review in Model.Reviews)
    {
        <div class="display-label">
            @Html.DisplayNameFor(model => review.ReviewId)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => review.Title)
        </div>

        <div class="display-label">
            @Html.DisplayNameFor(model => review.Body)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => review.CreatedAt)
        </div>
        <hr />
    }
</fieldset>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.Isbn }) |
    @Html.ActionLink("Back to List", "Index")
</p>

紐付けとかで困ることは一つもなさそうです。上記で回答になっているでしょうか? 

引用返信 編集キー/
■81193 / inTopicNo.5)  Re[3]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1016回)-(2016/09/01(Thu) 17:47:06)
No81182 (しーしゃーぷ さん) に返信

> それと、追加の質問で恐縮ですが、

このスレッドの最初の話とはかなり話が違ってきているように見えます。お手数ですが、最初の話の

> 一点分からないのが

という点が解決した後で、新たに別のスレッドを立てて質問していただけませんか?

後から検索などでこのスレッドにたどり着いた人のことを考えると、そうした方がいいのは理解いただ
けるのではと思います。
引用返信 編集キー/
■81205 / inTopicNo.6)  Re[3]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1018回)-(2016/09/02(Fri) 09:57:12)
No81182 (しーしゃーぷ さん) に返信

一つ気がついた点を補足します。

参考にされていた atmarkit の記事では親(Book クラス)にしかナビゲーションプロパティ
を設定していませんが、質問者さんの最初の質問文の例ですと、子(Post クラス)にもナビ
ゲーションプロパティを設定した方がよさそうです。

以下の記事の Post クラスのような感じです。

新しいデータベースの Code First
https://msdn.microsoft.com/ja-jp/data/jj193542.aspx

そうすれば join した LINQ を書かなくても、以下のようにして子のレコードと、その子に
関連する親のレコードを取得できます。

using (var db = new BloggingContext())
{
    var posts = from x in db.Posts select x;
    foreach (var post in posts)
    {
        Console.WriteLine("PostId: {0}, Title: {1}, Content: {2}, BlogId: {3}, Name: {4}",
            post.PostId, post.Title, post.Content, post.Blog.BlogId, post.Blog.Name);
    }
}

<参考>
SQL Server に生成されるテーブルのスキーマは、子のナビゲーションプロパティの有無によっ
て違ってきます。

EF でレコードの削除
http://surferonwww.info/BlogEngine/post/2015/12/21/entiry-framework-deleteion-of-records-in-tables-of-parent-child-relationship.aspx

引用返信 編集キー/
■81206 / inTopicNo.7)  Re[3]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1019回)-(2016/09/02(Fri) 10:17:54)
No81182 (しーしゃーぷ さん) に返信

【追伸】

上のレスのコード例、

using (var db = new BloggingContext())
{
var posts = from x in db.Posts select x;
foreach (var post in posts)
{
Console.WriteLine("PostId: {0}, Title: {1}, Content: {2}, BlogId: {3}, Name: {4}",
post.PostId, post.Title, post.Content, post.Blog.BlogId, post.Blog.Name);
}
}

ですが、一つ注意点を。

ASP.NET MVC ですと、

var db = new BloggingContext();
var posts = from x in db.Posts select x;

を Controller のアクションメソッドで行って posts を Model として View に渡し、View で

foreach (var post in posts)
{
・・・中略・・・
}

のようにするのが普通ですが、その場合 Controller のアクションメソッドで、上のレスのコード
例のように using 句を使って、

using (var db = new BloggingContext())
{
・・・中略・・・
}

とするのはダメです。理由は View の foreach のところで DB にアクセスに行くからです。

そんなことは言われなくても分かっているということでしたら失礼しました。
引用返信 編集キー/
■81218 / inTopicNo.8)  Re[4]: ASP.NET MVCでのテーブル結合
□投稿者/ しーしゃーぷ (5回)-(2016/09/02(Fri) 16:17:18)
No81192 (WebSurfer さん) に返信

> 「紐づけ」とはどういうことを言っているのか分かりませんので以下のレスは外しているかも
> しれませんが・・・
「紐づけ」、分かりづらくすみません。
ちょっと一般的になんと言って良いか分からず曖昧な表現にしてしまいました。。外部キーというのでしょうか?
SQL文でいうところのINNER JOIN〜の「ON」以降の部分、「=」で結びつけるお互いのテーブルのフィールドのことを
言いたかったです。
(他にも言い回しがおかしいところがあるかもしれません。)

> 紐付けとかで困ることは一つもなさそうです。上記で回答になっているでしょうか? 
頂いたソースのほうは理解できました。
実際に作るとなると困ることは無いのも理解できました。
ただ、Bookクラスでは、isbnが外部キーとなるかと思いますが、
Reviewクラスでは、何がBookクラスへのリレーションを貼る為の外部キーになるのか、
Reviewクラス内では記述が無いので内部的にどう判断されているかが分かりませんでした。

が、生成されたSQLServerのテーブルデザインを見て納得しました。(確認したのは自分で作っている人物データベースのほうですが。)
生成されたReviewテーブルに自動でBook_isbnというフィールドが自動生成されるということですね。


ただ、その場合、新たなる疑問が出てきまして、教えて頂いた以下のサイトの例で、
> 新しいデータベースの Code First
> https://msdn.microsoft.com/ja-jp/data/jj193542.aspx
の中のPostクラスの中にある、
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
の2行は、親であるBlogクラスのBlogIdへの外部キーと、親情報を取得するナビゲーションプロパティと思われますが、
public int BlogId { get; set; }
の行がなぜ、外部キーと認識されているのか?
なぜ、Blog_BlogIdがSQLServerに自動生成されないのかが分かりません。
親の外部キーとフィールド名が同じだからでしょうか?


ちょっと言い回しがうまくなく申し訳ないのですが、SQL文で説明すると
SELECT Blogs.*, Posts.* FROM Blogs LEFT JOIN Posts ON Blogs.BlogId = Posts.BlogId
というSQLで
Blogs.BlogId = Posts.BlogId
のイメージをクラス内でどう記述するかがイマイチ理解できていないということになります。
仮にPostクラスにBlogId2というフィールドを追加して、
Blogs.BlogId = Posts.BlogId

Blogs.BlogId = Posts.BlogId2
となるケースもあるかと思うので、どこかに「このフィールドが、このクラスとリレーションを貼る為の外部キーになる」ということを
明示的に記述されているのではないかと考えた次第です。


根本的なところで間違いがあるようであれば、ご指摘いただけるとありがたいです。


※追加の質問の件、大変失礼しました。本スレ解決後、改めて質問させて頂きます。

引用返信 編集キー/
■81222 / inTopicNo.9)  Re[5]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1021回)-(2016/09/02(Fri) 20:02:40)
No81218 (しーしゃーぷ さん) に返信

> 「紐づけ」、分かりづらくすみません。
> ちょっと一般的になんと言って良いか分からず曖昧な表現にしてしまいました。。外部キーというのでしょうか?

Code First でモデルの定義から DB の外部キーフィールドがどのように生成されるかは「規約」による
そうです。

クラスに外部キープロパティを含めると、以下の、前者の記事の「リレーションシップの規約」のセクシ
ョンや後者の記事の「外部キー」のセクションに書いてあるように DB の当該テーブルに外部キーが生成
されるということです。

Code First の規約
https://msdn.microsoft.com/ja-jp/data/jj679962.aspx

第2回 EF 4.1の規約とデータベースの初期化方法
http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst02/ef4codefirst02_02.html

> 生成されたReviewテーブルに自動でBook_isbnというフィールドが自動生成されるということですね。

そのようです。

参考にされていた atmarkit の記事ではクラスに外部キープロパティは定義されていませんが、フレーム
ワークが自動的に Book_isbn という外部キーフィールドを Reviews テーブルに生成します。

#それを書いた規約が見つからないので結果からの想像ですが、外部キーフィールド無しではナビゲーシ
 ョンプロパティが働かないので、クラスに外部キープロパティは定義されてなくても、フレームワーク
 が内部的に利用するための Book_isbn という外部キーフィールドを作るのではないかと思います。


>> 新しいデータベースの Code First
>> https://msdn.microsoft.com/ja-jp/data/jj193542.aspx
> の中のPostクラスの中にある、
> public int BlogId { get; set; }
> public virtual Blog Blog { get; set; }
> の2行は、親であるBlogクラスのBlogIdへの外部キーと、親情報を取得するナビゲーションプロパティと思われますが、
> public int BlogId { get; set; }
> の行がなぜ、外部キーと認識されているのか?

上に書いたように「規約」によるものでしょう。

上の前者の記事に書いてある「ナビゲーション プロパティに加えて外部キー プロパティを含めることを
お勧めします」に従って public int BlogId { get; set; } という外部キープロパティを設定したので、
規約の '<ナビゲーション プロパティ名><プリンシパル主キー プロパティ名>'、'<プリンシパル クラス
名><プライマリ主キー プロパティ名>'、'<プリンシパル主キー プロパティ名>' のうちの最後の形式に
一致して BlogId というフィールド名の外部キーが生成されたということでしょう。

> ちょっと言い回しがうまくなく申し訳ないのですが、SQL文で説明すると
> SELECT Blogs.*, Posts.* FROM Blogs LEFT JOIN Posts ON Blogs.BlogId = Posts.BlogId
> というSQLで
> Blogs.BlogId = Posts.BlogId
> のイメージをクラス内でどう記述するかがイマイチ理解できていないということになります。

クエリとしては違いますが、先のレスで書いた、

using (var db = new BloggingContext())
{
var posts = from x in db.Posts select x;
foreach (var post in posts)
{
Console.WriteLine("PostId: {0}, Title: {1}, Content: {2}, BlogId: {3}, Name: {4}",
post.PostId, post.Title, post.Content, post.Blog.BlogId, post.Blog.Name);
}
}

がその説明になっていると思います。(上記は SELECT Posts.* Blogs.* FROM Posts INNER JOIN
ON Blogs.BlogId = Posts.BlogId という感じ)


以上で質問の回答になっているでしょうか?
引用返信 編集キー/
■81315 / inTopicNo.10)  Re[4]: ASP.NET MVCでのテーブル結合
□投稿者/ しーしゃーぷ (6回)-(2016/09/07(Wed) 12:16:37)
No81222 (WebSurfer さん) に返信

> Code First の規約
> https://msdn.microsoft.com/ja-jp/data/jj679962.aspx
まさしく、こちらが疑問への回答でした!
プロパティ名によって自動的に判断されるんですね。

上記ページで諸々の疑問は解決されましたが、
新たに「fluent API」など自分の理想の動作に近づける為の疑問点が多々でてきましたので
それは、別途調べてみます。

ひとまず、当初の質問は解決しましたので、解決済みにさせて頂きます。
ありがとうございました!
解決済み
引用返信 編集キー/
■81317 / inTopicNo.11)  Re[5]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1028回)-(2016/09/07(Wed) 12:49:07)
No81315 (しーしゃーぷ さん) に返信
> ■No81222 (WebSurfer さん) に返信
>
>>Code First の規約
>>https://msdn.microsoft.com/ja-jp/data/jj679962.aspx
> まさしく、こちらが疑問への回答でした!

後で気がついたんですが、誤訳があるので注意してください。

「主キーの規約」のセクションで「"ID" の後ろにクラス名が続く名前が付いている場合」
というところは、英文では「the class name followed by "ID"」で逆です。

他にもあるかも。

> 上記ページで諸々の疑問は解決されましたが、
> 新たに「fluent API」など自分の理想の動作に近づける為の疑問点が多々でてきましたので
> それは、別途調べてみます。

Fluent API の使用を考える前に DataAnnotations の使用を考えた方がいいかもしれませ
ん。質問者さんの最初の質問のコードにあった [Key] がその一つです。

Code First のデータ注釈
https://msdn.microsoft.com/ja-jp/data/jj591583.aspx
解決済み
引用返信 編集キー/
■81318 / inTopicNo.12)  Re[5]: ASP.NET MVCでのテーブル結合
□投稿者/ WebSurfer (1029回)-(2016/09/07(Wed) 13:10:59)
No81315 (しーしゃーぷ さん) に返信

たびたびすみません。

先のレスで、なぜ、

> DataAnnotations の使用を考えた方がいいかもしれません

と書いたかと言うと、ユーザー入力の検証に便利だからです。ちょっと古い記事ですが
以下が参考になると思います。

[C#] #21. データ アノテーション検証コントロールでの検証
https://technet.microsoft.com/ja-jp/subscriptions/ff642519.aspx

今回の atmarkit の記事のサンプルような、親 (Book) とそれに関係する(FK が張られ
た)子のコレクション (Reviews) の検証も可能です。興味があれば以下の記事を見てく
ださい。

コレクションのデータアノテーション検証
http://surferonwww.info/BlogEngine/post/2014/09/01/validation-of-collection-data-during-model-binding-using-data-annotation.aspx
解決済み
引用返信 編集キー/
■81492 / inTopicNo.13)  Re[6]: ASP.NET MVCでのテーブル結合
□投稿者/ しーしゃーぷ (7回)-(2016/09/29(Thu) 11:20:47)
No81318 (WebSurfer さん) に返信
> 先のレスで、なぜ、
>
>>DataAnnotations の使用を考えた方がいいかもしれません
>
> と書いたかと言うと、ユーザー入力の検証に便利だからです。ちょっと古い記事ですが

すみません。
投稿を確認できておりませんでした。。

遅くなりましたが、DataAnnotationsにつきましても確認しました。
確かに検証が便利そうですね。
Fluent APIはまだイマイチ理解できてません・・・

ありがとうございました!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -