我有两个模型类——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
不是 null 并且是正确的child.Parent.Id
,但是 EF 将其丢弃并在数据库中创建了一个新的空父(使用不同的密钥)并将子链接到它。我已通过在添加( )child.Parent
之前将 附加到数据上下文来解决此问题。child
db.Parents.Attach(child.Parent)
但后来我遇到了另一个问题。起初,我的模型类是错误的并且没有[Required]
属性,因此创建了可为空的数据库表列。我添加了属性,代码停止工作。代码不起作用,因为ModelState.IsValid
isfalse
发生是因为child.Parent.Name
传递了child
is null
。
如何解决将孩子添加到父母的问题?我对以下解决方案感兴趣:
- 使用 EF Code-First 和 ASP.Net MVC
- 不涉及
child.Parent
从数据库中获取只是为了让模型验证器满意。 - 不涉及向
ParentId
模型添加显式外键 ( )。
这可能吗?