ASP.Net MVC.如何使用实体框架自动持久化关系数据
本文关键字:持久化 关系 数据 框架 实体 Net MVC 何使用 ASP | 更新日期: 2023-09-27 17:58:10
这是POCO代码第一类:
class Contact{
[Key]
public int Id {get; set;}
public string name {get; set;}
public ICollection<Phone> phones{get; set;}
}
class Phone{
[Key]
public int id {get;set;}
public string phone_type {get; set;}
public string phone_number {get; set;}
public Contact contact { get; set; }
}
我想在DB上坚持它。
这是控制器:
绑定的"contact"实例确实包含一个contact with a List phone with a lot phone。
public ActionResult Edit([Bind()] Contact contact) {
if (ModelState.IsValid)
{
db.Entry(contact).State = System.Data.Entity.EntityState.Modified;
db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(contact);
}
但这段代码只将Contact实例保留在数据库中。电话表仍然是空的。
是否有任何配置可以自动将相关的"电话"数据保存在数据库中,或者必须手动编码?
对于那些感兴趣的人来说,视图是这样的(简化):
@model SGD.Models.Contact
Name: @Html.EditorFor(model => model.name)
Phones: <div id="phones"></div>
其中#phonesdiv中填充了这个带有增量索引的分部。
<input name="phones[@index].id" type="hidden" />
<input name="phones[@index].phone_type" />
<input name="phones[@index].phone_number" />
现在我正在阅读,如果您只是将根实体中的State
更改为Modified
,则相关实体不会更改其状态(参考):
请注意,如果要附加的实体引用了其他实体尚未跟踪的实体,则这些新实体将附加到处于Unchanged状态的上下文--它们不会自动设置为Modified。如果您有多个实体需要标记为Modified您应该为以下各项设置状态各个实体。
尝试使用TryUpdateModel。我不完全确定它是否会更新相关实体,但如果您的模型绑定了相关实体,它应该更新。
var contact= db.Contacts.Include(c=>c.Addresses).FirstOrDefault(c=>c.Id==contact.Id);
TryUpdateModel(contact);
在这种情况下,我总是使用ViewModel,稍后我会使用Automapper 将其映射到我的一个实体
还有一个第三方库(GraphDiff),允许您将整个分离的模型/实体以及子实体和列表保存到数据库中,而无需编写代码