GenericRepository模式Update方法

本文关键字:方法 Update 模式 GenericRepository | 更新日期: 2023-09-27 18:28:14

我正在尝试使用工作单元和存储库模式,并且我有下面的"update"方法,如果我要替换表行中的所有元素(id,color,year),它会很好地工作。

public virtual void Update(TEntity entityToUpdate)
{
    dbSet.Attach(entityToUpdate);
    (entityToUpdate).State = EntityState.Modified;
}

但我只想更新我正在传递的特定列(id&color)。它将覆盖其他元素(年)。

例如,我在Cars表中有一个数据库记录:

Id = 1,
color = "red"
year = 2010

如果我这样更新…

var location = new Car
{
    Id = 1,
    color = "blue"
};

unitOfWork.CarRepository.Update(car);

现在的记录是:

Id = 1,
color = "blue"
year = null 

我如何重写我的通用存储库方法,只更改我给它提供的内容?(即保持年份值)

GenericRepository模式Update方法

使用通用存储库模式将无法合理地做到这一点。你真的没有必要使用这种模式。EntityFramework已经是一个通用存储库,为什么需要将其封装在另一个通用库中?这种类型的抽象会增加负值。

你确实想从你的控制器封装你的数据库使用(MVC控制器中不应该有DbContext),但你不需要任何特殊的模式。只需将DbContext注入一个有效的类中。

此外,如果你把UOW传来传去,那么大部分工作模式的单位都是反模式。这在应用程序中产生了一些非常疯狂的耦合问题,完全不相关的代码能够影响截然不同的代码段。

删除通用存储库并直接在您的服务/DAL/资源类(无论您想怎么称呼它)中使用EF,将使您能够获得EF的全部功能。这将允许非常琐碎地进行部分更新。

要使用通用存储库进行部分更新,您需要一些用于处理映射的重载动态代码。老实说,理论上我可以写这篇文章,但我知道不应该写这篇。映射越抽象,它就越脆弱,几乎不可能预测如何处理映射的未来。这就是为什么有像AutoMapper这样的完整库来处理如何进行映射的无限数量的组合。AutoMapper也有点用词不当,虽然它可以在大多数情况下进行基本的自动映射,但AutoMapper的用例仍然是所有的静态映射,而不是动态映射。您需要创建动态贴图,也就是水晶球贴图。

您编写的更新方法假设您已经从一个设置了属性的现有实体对象开始。存储库假设您的业务逻辑是这样工作的:

var car = repo.GetCar(id);
car.prop1 = "new value";
car.prop2 = "another new value";
repo.update(car);

这将保留您以前设置的任何值。