2

我正在使用 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 []?),或者更新单个属性的不太笨拙的方法(不移动到实体属性值模型)?

4

2 回答 2

0

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

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

于 2013-01-04T02:57:12.453 回答
0

简而言之:做到这一点的干净方法是获取您想要更新的实体标识参数和一组属性值,并将它们传递给服务层。

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

但是,常见的方法是使用DTO 对象 原则来干净地简化您的 CRUD 操作。有关DTO 及其有用处的更多信息。

于 2013-01-04T05:21:27.513 回答