【问题标题】:ASP.Net MVC. How automatically persist relational data using Entity Framework?ASP.Net MVC。如何使用 Entity Framework 自动持久化关系数据?
【发布时间】:2016-07-22 13:07:36
【问题描述】:

这是 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; }
}

我想将它持久化到数据库中。

这是控制器:

绑定的“联系人”实例确实包含一个联系人,其中包含一个包含大量电话的电话列表。

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 实例保留在 db 上。电话表仍然是空的。

是否有任何配置可以自动将相关的“电话”数据保存在数据库上,还是必须手动编码?

对于那些感兴趣的人,视图是这样的(简化):

@model SGD.Models.Contact
Name:    @Html.EditorFor(model => model.name)
Phones: <div id="phones"></div>

#phones div 用这个带有增量索引的部分填充。

<input name="phones[@index].id" type="hidden" />
<input name="phones[@index].phone_type" />
<input name="phones[@index].phone_number" />

【问题讨论】:

  • 请显示您如何在视图中添加/删除手机
  • @octavioccl 我添加了简化的视图代码。但我确信控制器从视图中正确绑定数据。这里的问题只是将其保留在 db 上。
  • 您是否调试过您的操作以确保手机带有联系人?
  • @octavioccl 是的。我确定。我调试并观察了这个变量。它包含数据。 imgur.com/a/FchXP(这是真实截图,比上面的简单例子要复杂得多)

标签: c# asp.net asp.net-mvc entity-framework ef-code-first


【解决方案1】:

现在我正在阅读,如果您只是将根实体中的 State 更改为 Modified,相关实体不会更改其状态 (reference):

请注意,如果被附加的实体具有对其他实体的引用 尚未跟踪的实体,那么这些新实体将 在 Unchanged 状态下附加到上下文——它们不会 自动进行修改。如果您有多个实体 需要标记为已修改,您应该为每个设置状态 单独的实体。

尝试使用TryUpdateModel。我不完全确定它是否会更新相关实体,但如果您的模型绑定了相关实体,它应该会更新。

var contact= db.Contacts.Include(c=>c.Addresses).FirstOrDefault(c=>c.Id==contact.Id);
TryUpdateModel(contact);

在这种情况下,我总是使用 ViewModel,稍后我使用 Automapper 将其映射到我的一个实体

还有一个第 3 方库 (GraphDiff),允许您将整个分离的模型/实体以及子实体和列表保存到数据库,而无需编写代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多