我们的代码中有一个场景,即只允许更改实体的少数属性。为了保证这一点,我们有类似这样的代码:
public void SaveCustomer(Customer customer)
{
var originalCustomer = dbContext.GetCustomerById(customer.Id);
if (customer.Name != originalCustomer.Name)
{
throw new Exception("Customer name may not be changed.");
}
originalCustomer.Address = customer.Address;
originalCustomer.City = customer.City;
dbContext.SaveChanges();
}
这段代码的问题是调用dbContext.GetCustomerById
并不总是给我一个新的Customer
类实例。如果客户已经从数据库中获取,Entity Framework 会将实例保存在内存中,并在每次后续调用时返回它。
这将我们引向实际问题——customer
并且originalCustomer
可能指的是同一个实例。在这种情况下,customer.Name
将等于originalCustomer.Name
,我们将无法检测它是否与数据库不同。
我猜大多数其他 ORM 也存在同样的问题,因为 identitymap 设计模式。
有什么想法可以解决这个问题吗?我可以以某种方式强制 EF 始终为我提供客户类的新实例吗?
还是我们应该重构代码?有谁知道这种场景有什么好的设计模式?