C# 实体框架延迟加载所有实体上具有相同多对多值的所有属性。是虫子吗?

C# 实体框架延迟加载所有实体上具有相同多对多值的所有属性。是虫子吗?,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我注意到在实体框架中使用“部分代理”时出现了一些意外行为,即不是完全更改跟踪代理。我有一个解决办法,但它看起来像一个错误 我的Currency类是多对多的,与其他类一起使用,例如BusinessEntity和businesstransaction。他们都有货币财产;事实上,一项交易有两种,SourceCurrency和BookCurrency 根据下面的代码,您可能希望SourceCurrency将从GBP更改为USD,但事实并非如此: using (var ctx = new MyContex

我注意到在实体框架中使用“部分代理”时出现了一些意外行为,即不是完全更改跟踪代理。我有一个解决办法,但它看起来像一个错误

我的Currency类是多对多的,与其他类一起使用,例如BusinessEntity和businesstransaction。他们都有货币财产;事实上,一项交易有两种,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最初更改为新的美元货币,但当我们延迟加载client.currency属性时,它会重置为其原始值。上下文似乎正在检查哪些其他代理共享该值,而不管它们是否已被更改,它都会设置它们

我可以通过在调试器中单步执行属性设置程序来证明这一点,并且在触摸client.Currency的同时设置所有三个属性

如果我取消对该语句的注释:

var bookCurrency = client.Currency; 
问题消失,新设置不会被覆盖

有几个问题与EF代理的内部行为有关。很难说这是错误还是怪癖。我猜这是设计完成的,但我会假设已经对属性值进行了更改的代码会同步共享相同值的所有惰性属性


我的问题是:你认为这是我应该向EF团队提出的一个bug吗?

这些find方法的作用是什么?任何可能影响此行为的行为?只需执行查找并检查实体是否已找到。它们与问题无关:var entity=collection.Find(id);检查。不为空(实体,“实体”);返回实体;我已经看过了,但是在EF6.1.1中,我无法复制它。这过去与未加载的引用(如
transaction.SourceCurrency
)相关,因此更改跟踪器没有注意到修改。但EF 6.1.1似乎在这一点上有所改进。我最近与EF团队就部分代理的空引用问题进行了交流,据我所知,这仍然是一个活生生的问题: