UnitOfWork抽象背后的EF - 获取插入的id(再一次)

时间:2017-10-15 20:03:06

标签: .net entity-framework unit-of-work fody-propertychanged

在我的解决方案中,使用存储库模式的UnitOfWork抽象EntityFramework上下文有多种原因,例如:

  • DB第一种方法(edmx和自动生成的实体)
  • 纯ADO和EF实现
  • 域和数据库架构分离

所以我想出了一个问题,我需要添加两个相关的实体,但不幸的是,DB架构没有为该关系提供外键。 我们说它是await _client.DeleteDocumentAsync(uri); Customer关系。因此,这使得我无法使用普通的EF功能将这些实体存储在数据库的“一次性”中。这意味着我需要先存储Address,然后我需要在首次插入时将CustomerAddress存储起来。

我遇到的问题是当我将域模型传递到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)。也许有更多的解决方案可以解决这个问题?

0 个答案:

没有答案