更新MVC中的实体属性

本文关键字:实体 属性 MVC 更新 | 更新日期: 2023-09-27 17:50:41

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

更新MVC中的实体属性

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

在服务层,你可以用实体标识符调用你的Repository,检索单个实体并更新你想要做的特定属性。

然而,常见的方法是使用DTO对象原则来清晰地简化您的CRUD操作。更多关于DTO及其用途的信息。

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

编辑:从你的评论扩展,NHibernate的存在是为了让你不必担心你的模型(数据库)和控制器之间接口的实现细节。它是一个为您处理所有管道的框架。以模块化的方式构建应用程序,以便重要的功能可以在以后轻松地交换到其他功能,而不会在整个应用程序中产生连锁反应。用存储库模式包装nhibernate逻辑。然后,您可以在将来使用不同的ORM,而无需更改控制器与数据层通信的方式。