在我的解决方案中,使用存储库模式的UnitOfWork抽象EntityFramework上下文有多种原因,例如:
所以我想出了一个问题,我需要添加两个相关的实体,但不幸的是,DB架构没有为该关系提供外键。
我们说它是await _client.DeleteDocumentAsync(uri);
和Customer
关系。因此,这使得我无法使用普通的EF功能将这些实体存储在数据库的“一次性”中。这意味着我需要先存储Address
,然后我需要在首次插入时将Customer
与Address
存储起来。
我遇到的问题是当我将域模型传递到UnitOfWork存储库时
CustomerID
我无法让UnitOfWork.CustomersRepository.Add(customerModel);
UnitOfWork.SaveChanges();
将其传递到下一个db请求中。
我真的不想通过在CustomerID
存储库方法中针对EF上下文调用.SaveChanges()
来打破模式。
经过一番调查后,我发现在这种情况下,我能得到的最好的事情是将这个过程包装成事务(这迫使我在Repository方法中使用.Add
)但是efcontext.SaveChanges()
实际上会提交整个事务。
但我也找到了另一种方法,我从未在任何SO答案中看到过。我正在调查是否有任何方式可以通知' UnitOfWork.SaveChanges()
自动生成类中CustomerID
属性更改的域模型。还有一个图书馆可以提供帮助:https://github.com/Fody/PropertyChanged
自动生成的EF类定义为Customer
,这使我有能力编写:
partial
然后是public partial class Customer : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
方法:
.Add
由于我没有修改任何自动生成的代码,我没有严重破坏UoW模式,我能够在外面提供插入的ID。
但我的问题是,我不确定这种方法是否可以接受,我不确定使用哪种方法(交易或Fody)。也许有更多的解决方案可以解决这个问题?