[asp.net-mvc]更新的最佳实践第一次有关在 ASP.NET MVC + EF4 没有加载实体的实体

发布时间: 2017/3/25 17:25:10
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我见过一些问题有关的话题,但找不到这种情况下的答案。

我有像结构
alt text

我的控制器的一部分

//
// GET: /Person/Edit/5

public ActionResult Edit(int id)
{
    var viewModel = new PersonViewModel(PersonRepository.Get(id));
    return View(model);
}

//
// POST: /Person/Edit

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(PersonViewModel model)
{
    PersonRepository.Update(model.Person, model.Phones);
    return RedirectToAction("Index");
}

在我的存储库 im 做这样的事情︰

public void Update(Person person, ICollection<Phone> phones)
{
    using (var unitOfWork = UnitOfWork.Current)
    {
         Attach(contact);
         UpdatePhones(contact, phones);
         unitOfWork.Commit();
    }
}
public Person Attach(Person person)
{
     Context.AttachTo("Persons", entity);
     Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
     return entity;
}
public void UpdatePhones(Person person, ICollection<Phone> phones)
{
    if (phones == null || phones.Count == 0) return;
    foreach (var phone in phones.Where(o => o.IsDeleted && !o.IsNew))
    {
         PhoneRepository.Delete(phone);
    }
    foreach (var phone in phones.Where(o => !o.IsDeleted && o.IsNew))
    {
         party.Phones.Add(phone);
    }
    foreach (var phone in phones.Where(o => !o.IsDeleted && !o.IsNew))
    {
         phone.PartyID = party.ID;
         PhoneRepository.Attach(phone);
    }
}

IsDeleted IsNew 不保存到数据库和动态表单中使用。PhonesRepository attach () 是相同的。

我做所有我像这样的更新,因为我需要减少数据库调用尽可能多的数量。也许这就是一个已知的最佳实践吗?

谢谢 =)

解决方法 1:

这一点都不坏。非常类似于我们的设置。

对夫妇的指针︰

1-为您的存储库中使用泛型。附加的代码很简单,和应该不需要实体之间复制。如果您创建了 GenericRepository<T> ,然后将您附加代码︰

public T Attach<T>(T entity) where T : class
{
     Context.GetEntitySet<T>.Attach(entity); // pluralization on (typeof)T.name to get entity set
     Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
     return entity;
}

2-我会分开 UpdatePhones 方法为单独的方法。我不会依赖一个标志 (IsDeleted 等) 来确定的行动方针。我会更加明确。

3-看起来好像你有 PhoneRepository 吗?为什么呢?Person是你聚合的根,和 Phone 总是与有关的特别是 Person ,因此你应该只有 PersonRepository 在此聚合的边界。你应该将附加到 Phones ObjectSet' 的一个特定的人。

顺便说一句 — — 我假设您有延迟加载禁用?如果不是,在集合这些 LINQ 操作将导致无声的往返行程。

除了以上各点 (这是主要设计相关),optimization-wise 您的代码看起来对我很好。

最后请注意--还有另一种推荐的技术 (亚历克斯 · 詹姆斯) 更新实体在脱离上下文 (aka MVC) 中的被称为"存根 (stub) 技术"。

我问了一个问题 (和我自己解决了这个问题) 几天前如果你感兴趣,检查出来

湘南。

官方微信
官方QQ群
31647020