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" />

ASP.Net MVC.如何使用实体框架自动持久化关系数据

现在我正在阅读,如果您只是将根实体中的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),允许您将整个分离的模型/实体以及子实体和列表保存到数据库中,而无需编写代码