在使用Entity Framework的“部分代理”时,我注意到了一些意外的行为,即没有完全更改跟踪的行为。我有一个解决方法,但它看起来像是一个bug。
我的Currency类与其他类是多对多的,例如BusinessEntity和业务事务。他们都有货币财产;事实上,一个Transaction有两个,SourceCurrency和BookCurrency。
根据下面的代码,您可以预期SourceCurrency将从GBP更改为USD,但不是:
using (var ctx = new MyContext())
{
// all currencies are currently set to GBP
var transaction = ctx.Transactions.FindWithNullCheck(transactionId);
var client = ctx.BusinessEntities.FindWithNullCheck(businessEntityId);
var sourceCurrency = ctx.FindCurrencyByCode("USD");
// var bookCurrency = client.Currency;
transaction.SourceCurrency = sourceCurrency;
transaction.BookCurrency = client.Currency; // Bug here!
ctx.SaveChanges();
};
实际发生的是SourceCurrency最初更改为新的USD货币,但是当我们延迟加载client.Currency属性时,它会重置为其原始值。似乎上下文正在检查其他代理共享该值的内容,并且无论它们是否已被更改,它都会设置它们。
我可以通过调试器中的属性setter来证明这一点,并且在触摸client.Currency时同时设置所有三个属性。
如果我取消注释声明:
var bookCurrency = client.Currency;
问题消失,新设置未被覆盖。
有几个与EF代理的内部行为有关的问题。很难说这是一个错误还是一个怪癖。我想这是通过设计完成的,但我会假设已经对属性值进行的更改将由同步所有共享相同值的延迟属性的代码来支持。
我的问题是:您认为这是我应该向EF团队提出的错误吗?