私は 2 つのモデル クラスを持っていParent
ますChild
。これらは、型指定されたナビゲーション プロパティを介してのみリンクされています。
public class Parent {
[Key]
[Required]
public int Id { get; set; }
[Required]
public string ParentName { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child {
[Key]
[Required]
public int Id { get; set; }
[Required]
public string ChildName { get; set; }
[Required]
public virtual Parent Parent { get; set; }
}
Child
ここで、ASP.Net MVC を使用して親用に新しいものを作成したいと考えています。まず、ビューをユーザーに表示する必要があります。どうにかして親オブジェクト キーをビューに渡す必要があります。ParentName も表示したいと思います。データベースからオブジェクトをフェッチしParent
、新しいChild
オブジェクトを作成し、そのParent
プロパティをフェッチしたオブジェクトに設定するだけparent
です。
public ActionResult Create(int parentId) {
var parent = db.Parents.Find(parentId);
if (parent == null) {
return HttpNotFound();
}
var child = new Child() { Parent = parent};
return View(child);
}
ユーザーがフォームに入力すると、Create
HTTP POST を使用してデータがアクションに送信されます。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Child child)
{
if (ModelState.IsValid)
{
//db.Parents.Attach(child.Parent); //Added later
db.Children.Add(child);
db.SaveChanges();
return RedirectToAction("Index", new { parentId = child.Parent.Id });
}
}
ここで、最初の問題にぶつかりました。はchild.Parent
nullchild.Parent.Id
ではなく、正しいものでしたが、EF はそれを破棄し、データベースに新しい空の親 (別のキーを持つ) を作成し、子をそれにリンクしました。( )child.Parent
を追加する前に をデータ コンテキストにアタッチすることで、この問題を修正しました。child
db.Parents.Attach(child.Parent)
しかし、その後、別の問題に見舞われました。[Required]
最初は、モデル クラスが間違っていて、属性がなかったため、null 許容データベース テーブル列が作成されました。属性を追加したところ、コードが機能しなくなりました。ModelState.IsValid
isが渡されたために発生false
するため、コードは機能しません。child.Parent.Name
child
null
子を親に追加する問題はどのように解決できますか? 次のソリューションに興味があります。
- EF Code-First と ASP.Net MVC を使用
child.Parent
モデルバリデーターを満足させるためだけに、データベースからを取得する必要はありません。ParentId
モデルに明示的な外部キー ( ) を追加する必要はありません。
これは可能ですか?