私は 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);
}
ユーザーがフォームに入力すると、CreateHTTP 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.Parentnullchild.Parent.Idではなく、正しいものでしたが、EF はそれを破棄し、データベースに新しい空の親 (別のキーを持つ) を作成し、子をそれにリンクしました。( )child.Parentを追加する前に をデータ コンテキストにアタッチすることで、この問題を修正しました。childdb.Parents.Attach(child.Parent)
しかし、その後、別の問題に見舞われました。[Required]最初は、モデル クラスが間違っていて、属性がなかったため、null 許容データベース テーブル列が作成されました。属性を追加したところ、コードが機能しなくなりました。ModelState.IsValidisが渡されたために発生falseするため、コードは機能しません。child.Parent.Namechildnull
子を親に追加する問題はどのように解決できますか? 次のソリューションに興味があります。
- EF Code-First と ASP.Net MVC を使用
child.Parentモデルバリデーターを満足させるためだけに、データベースからを取得する必要はありません。ParentIdモデルに明示的な外部キー ( ) を追加する必要はありません。
これは可能ですか?