實體框架核心:如何在使用內存數據存儲區時測試導航屬性加載

asp.net-core entity-framework-core navigation-properties

實體框架核心中存在一個有趣的特徵:

實體框架核心將自動將導航屬性修復為先前加載到上下文實例中的任何其他實體。因此,即使您沒有明確包含導航屬性的數據,如果之前加載了部分或全部相關實體,仍可能會填充該屬性。

在某些情況下這很好。然而,目前我正在嘗試使用高級語法添加建模多對多關係,並且不想檢查,我創建的映射效果很好。

但實際上我不能這樣做,因為如果讓我說我有類似的東西:

class Model1{
   ... // define Id and all other stuff
   public ICollection<Model2> Rel {get; set;}
}

Model1 m1 = new Model1(){Id=777};
m1.Rel.Add(new Model2());
ctx.Add(m1);
ctx.SaveChanges()

var loaded = ctx.Model1s.Single(m => m.Id == 777);

因此,由於自動loaded.Relloaded.Rel 。即使我不包含任何內容,也會填充已loaded.Rel字段。所以有了這個功能,我實際上無法檢查任何內容。無法檢查我是否使用了正確的映射,並且我對Include正常工作。考慮到這一點,我應該更改哪些能夠對我的導航屬性進行正常測試?


我創建了一個應該傳遞的測試用例,但現在失敗了。 那裡可以找到確切的代碼

我正在使用.Net Core 2.0預覽1和EF核心。

一般承認的答案

如果要使用內存數據存儲測試導航屬性,則需要使用AsNoTracking()擴展以“非跟踪”模式加載項目。

所以,對於你的情況,如果var loaded = ctx.Model1s.Single(m => m.Id == 777);使用關係返回項目,而不是重寫為:
var loaded = ctx.Model1s.AsNoTracking().Single(m => m.Id == 777);這將返回沒有deps的原始項目。

那麼如果你想再次檢查Include ,你可以寫一些像ctx.Model1s.AsNoTracking().Include(m => m.Rel).Single(m => m.Id == 777);這將使您包含的關係返回模型。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow