【问题标题】:Updating entity properties in MVC在 MVC 中更新实体属性
【发布时间】:2013-01-04 02:42:01
【问题描述】:

我正在使用 MVC 3 Razor (c#),在我看来,我正在显示一个用户只能更新 Name 属性的实体。

public class Product{
    public Guid Id {get; set; }
    public string Name {get; set;}
    public string Type {get; set;}
  }

为了防止在再次保存之前从数据库中加载整个对象,我使用了如下方法:

public void UpdateProduct(Guid id, Hashtable propertiesToUpdate) {}

在业务对象中,允许通过 AJAX 请求或表单 Post 更新实体的一组属性。 (数据恒定性是使用时间戳完成的)。

我查看了其他方法,例如在检测到更改时使用 INotifyPropertyChanged 更新属性,但这似乎只有在您能够在请求之间保留实例或在进行更改之前加载整个实体时才有用(这看起来很重)。

我看到 NHibernate 在类似的想法中使用了动态更新。这是否会导致 NHibernate 从数据库中加载数据并在生成更新语句之前进行比较?

是否有在请求之间保持正在编辑的对象(Session[]?)的最佳方法,或者更新单个属性的不太笨拙的方法(不移动到实体属性值模型)?

【问题讨论】:

  • stackoverflow.com/questions/1243390/… 似乎从 NHibernate 方面解决了类似的想法。
  • 最后我使用了一个内部列表 UpdatedPropertiesList 并且数据存储的更新调用在更新之前检查了这个列表。无需先加载对象即可享用美食。

标签: c# asp.net-mvc nhibernate


【解决方案1】:

简而言之: 简洁的方法是获取您想要更新的实体身份参数和一组属性值,并将它们传递给服务层。

在服务层中,您可以使用实体标识符调用您的存储库并检索单个实体并更新您想要执行的特定属性。

但是,常见的方法是使用DTO objects 原则来彻底简化您的 CRUD 操作。更多关于DTO and where it is useful.

【讨论】:

  • 这与我现在所做的非常接近,感谢您的分解!有时我发现自己陷入了最佳架构实践的困境。
  • 没问题,采用简单、直接、可维护的解决方案是可行的。
【解决方案2】:

除了处理路由和控制器实例化的应用程序本身之外,MVC 中没有状态。您不想尝试将某种状态硬塞到应用程序中,因为没有好的方法可以保证它不会像 AppDomain 回收中那样被随机销毁。在加载页面时从数据库中检索记录一次并在使用 POST 数据更新它时再次检索记录是否有问题?我相信这就是通常的做法。使用 NHibernate 唯一可能需要很长时间的是 SessionFactory 的创建,其他一切都非常快。

编辑:根据您的评论扩展,NHibernate 在那里,因此您不必担心模型(数据库)和控制器之间的接口的实现细节。它是一个为您处理所有管道的框架。以模块化方式构建您的应用程序,以便以后可以轻松地将重要功能交换为其他功能,而不会在整个应用程序中产生连锁反应。使用存储库模式包装 NHiberante 逻辑。然后,您将来可以使用不同的 ORM,而无需更改控制器与数据层通信的方式。您可能需要研究控制反转/依赖注入来帮助解决这个问题。

【讨论】:

  • 当我试图围绕洋葱架构之类的想法进行思考时,基本上这是我的问题。我假设在更新字段并将其发送回数据库之前从数据库中加载记录是很多开销。是否值得担心这样一个过程的开销?
  • 基本上我今天尝试的是不要担心实现细节,担心应用程序设计。让框架处理管道。
  • 考虑过 ORM,但出于各种原因避免使用它们。谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2014-09-07
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多