我有两个模型类 - Parent
和Child
,它们只通过类型化的导航属性进行链接。在没有显式外键id字段的情况下向父节点添加子对象MVC
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; }
}
现在我想为使用ASP.Net MVC的父代创建一个新的Child
。首先,我需要向用户展示一个视图。我需要以某种方式将父对象键传递给视图。我也想显示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);
}
用户填写表单后,数据被发送到使用HTTP POST的Create
动作。
[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
不为空且child.Parent.Id
是正确的,但EF将其抛出并在数据库中创建了一个新的空父对象(使用不同的键),并将子对象连接到它。在添加child
(db.Parents.Attach(child.Parent)
)之前,我通过将child.Parent
附加到数据上下文来解决此问题。
但后来我又遇到了另一个问题。起初,我的模型类是错误的,并没有[Required]
属性,从而创建可为空的数据库表列。我添加了该属性,代码停止工作。代码不起作用,因为ModelState.IsValid
是false
发生这是因为child.Parent.Name
通过child
是null
。
怎样才能解决孩子加入父母的问题?我感兴趣的解决方案:
- 使用EF代码优先和ASP.Net MVC
- 不涉及获取从数据库中
child.Parent
只是为了使模型验证高兴。 - 不涉及将明确的外键(
ParentId
)添加到模型。
这可能吗?
你为什么不有'的ParentId”沿W /父。如果你映射它可以让你插入不需要附加/重新加载,并通过索引单独。我一般在说话。这可能会简化你的情况,层次结构总是有点棘手。如果有兴趣,让我知道,如果你不知道如何去做,我会提出并回答。 – NSGaga 2013-04-07 23:20:54
我现在看到那是你的先决条件(我的错误)。但是,这会让你的生活更轻松。此外,建议出于其他原因。 – NSGaga 2013-04-07 23:43:04