だから、私はEntity Framework Coreを試しています。私の最初の1組の関係モデルに問題があります。私は、次のように、関係を形成するために慣例を使用しようとしています。
従来のプリンシパルキー(Id)とコレクションナビゲーションプロパティ(場所のリスト)を持つ主体
public class Site
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public int LocationCount { get; set; } = 1;
public List<Location> Locations { get; set; } = new List<Location>();
}
従属エンティティは、従来の外部キー(SiteId)および参照ナビゲーションプロパティ(Site)を使用しています。
public class Location
{
public int Id { get; set; }
public int SiteId { get; set; }
public Site Site { get; set; }
public int AreaCount { get; set; } = 1;
public Location(Site site) { SiteId = site.Id; }
}
そして、私はすべてのサイトに既に少なくとも1つの場所があるようにしたいので、これをSiteControllerのCreateアクションに入れて、プリンシパルと共に扶養家族を作成しようとします:
[HttpPost]
public IActionResult Create(Site site)
{
_context.Sites.Add(site);
for (int i = 0; i < site.LocationCount; i++)
_context.Locations.Add(new Location(site));
_context.SaveChanges();
return RedirectToAction("Details", new { Name = site.Name });
}
ただし、[詳細]ビューで、作成された場所を表示しようとすると、リストは常に空になります。
<h2>@Model.Locations.Count Locations</h2>
@foreach (Location l in Model.Locations)
{
<div class="row">
<div class="col-sm-12">@l.Id</div>
</div>
}
ちょうど結果:
0 Locations
私が逃したことを説明する助けを前もってありがとう!
編集:要求によって、詳細ビューのモデルデータを取得するサイトコントローラの詳細アクションの本文が表示されます。
public IActionResult Details(string name)
{
var model = _context.Sites.FirstOrDefault(a => a.Name == name);
if (model == null) model = new Site();
return View(model);
}
また、SaveChanges()が呼び出された後までIdが自動的に生成されないため、Site.Idが値を持つ前に、1つの提案ごとにLocation.SiteIdを設定する問題を修正しました。残念ながら、結果(空のLocationsリスト)は同じです:
[HttpPost]
public IActionResult Create(Site site)
{
int nextsiteid = _context.Sites.Count() + 1;
_context.Sites.Add(site);
for (int i = 0; i < site.LocationCount; i++)
_context.Locations.Add(new Location(siteid));
_context.SaveChanges();
return RedirectToAction("Details", new { Name = site.Name });
}
また、Locationコンストラクタを変更して、インスタンスの代わりにIdを使用するようにしました。
public Location(int siteid) { SiteId = siteid; }
今後のご提案ありがとうございました!
私は、私が与えられた答えを転記しています。これは、元の投稿のコメントで提供されているので、投稿を読んでいる人が簡単に見つけることができます。
この問題は、EF Coreがまだ遅延ロードをサポートしていないことを単純に示しています。したがって、サイトエンティティにデータが入力されると、依存する場所のリストがコレクションのナビゲーションプロパティに遅延ロードされることはありません。
この問題を解決するには、
var model = _context.Sites.Include(s => s.Locations).FirstOrDefault(a => a.Name == name);
ビューに提供するサイトのモデルデータを読み込むとき。
ソリューションをありがとう、イワン!
Lazy Loadingがtrueの場合ループしたり、子をナビゲートする必要はありません。あなたの親も子供も救うでしょう。あなたは親とその子供を得ていることを確認してください
[HttpPost]
public IActionResult Create(Site site)
{ // debug here are you getting parent & its child ?
_context.Sites.Add(site);
// for (int i = 0; i < site.LocationCount; i++) // No need of it
// _context.Locations.Add(new Location(site)); // No need of it
_context.SaveChanges();
return RedirectToAction("Details", new { Name = site.Name });
}
更新:これらの2つのテーブルが互いにリンクされている場合、&手動でロケーションテーブルを追加しようとしています。私はあなたにシンプルな、これはあなたを助ける願ってみましょう
[HttpPost]
public IActionResult Create(Site site)
{ // debug here are you getting parent & its child ?
_context.Sites.Add(site);
// get the last added site id
int? maxId=
_context.Sites.orderbyDecending(x=>x.SiteId).FirstorDefault(x=>x.SiteId);// may be in this line typing mistake , you change it according to linq
foreach(var i in site.Location)
{
// in this loop traverse the child array and override the foreign key id with last added id
i.SiteId =maxId;
_context.Locations.Add(i);
}
_context.SaveChanges();
return RedirectToAction("Details", new { Name = site.Name });
}