1

私は 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モデルに明示的な外部キー ( ) を追加する必要はありません。

これは可能ですか?

4

5 に答える 5

0
  public class Menu
{
    //public Menu()
    //{
    //    {
    //        this.Templates = new HashSet<MenuTemplate>();
    //    }

    //}
    [Key]
    public int MenuId { get; set; }

    [Column("MenuCaption")]
    [Display(Name = "Menu Caption")]
    [StringLength(100)]
    public string MenuCaption { get; set; }

    [Display(Name = "Parent Menu")]
    public int? ParentMenuId { get; set; }
    public virtual Menu ParentMenu { get; set; }
    [Display(Name = "Is Group")]
    public bool IsGroup { get; set; }

    [Display(Name = "Menu Order")]
    public int MenuOrder { get; set; }

    [Display(Name = "Visibility")]
    public bool Visibility { get; set; }
    [Display(Name = "Visibility Main Menu")]
    public bool VisibilityMM { get; set; }
    [Column("Controller")]
    [Display(Name = "Controller")]
    [StringLength(100)]
    public string Controller { get; set; }
    [Column("Action")]
    [Display(Name = "Action")]
    [StringLength(150)]
    public string Action { get; set; }






    [Display(Name = "Icon")]
    public int? IconID { get; set; }
    [ForeignKey("IconID")]
    public virtual Icon Icon { get; set; }




    public virtual ICollection<MenuTemplate> Templates { get; set; }
}
于 2016-04-20T14:46:10.007 に答える
0

これはCreateメソッドで機能すると思います:

public ActionResult Create([Bind(Exclude="Parent")]Child child)
于 2014-10-14T13:36:16.680 に答える