簡體   English   中英

如何播種EF Core 2.1數據而不將這些數據始終存儲在內存中

[英]How to seed EF Core 2.1 data without that data always in memory

Visual Studio 2017版本15.8.4

.NET Core 2.1

Microsoft.EntityFrameworkCore 2.1.3

根據我已閱讀的指南, 數據種子植入是我用來生成插入數據遷移的方法。 EntityTypeBuilder.HasData是用於確保遷移包含用於插入數據的代碼的方法,而DbContext.OnModelCreating是執行此操作的時間。

我有一個大表,我正在從DbContext.OnModelCreating中的文件填充。 我也有一個NUnit測試項目,其中包含一個集成測試,該集成測試執行涉及數據庫的代碼。 該測試當前失敗,因為實例化我派生的DbContext會導致對OnModelCreating的調用,該嘗試試圖打開我的大文件並將其導入。 由於我的測試項目正在創建我的執行上下文,因此數據文件的相對路徑是不同的,因此它找不到該文件,並引發異常。

那不是問題。 我可以輕松查找該文件,如果不存在則返回。 但是,此異常引起我的注意,即在我第一次在應用程序域中實例化派生的DbContext類時,總是會調用OnModelCreating的事實,這意味着即使我沒有查詢整個表,該表也將存在於內存中數據庫的內容,這似乎擊敗了擁有數據庫的目的。

因此,我可以刪除讀取該文件的OnModelCreating中的代碼(突然我的測試通過),但是如果這樣做,則下次添加遷移時,Migration.Up中的代碼將清除該內容。表。 除非我為在ModelSnapshot中生成的此表擦除EntityTypeBuilder.HasData調用,否則這似乎是一個非常骯臟的hack,並且在將來要更改任何類似的一系列hack之前,我必須手動撤消該調用該表的內容。

因此,問題是,如何在實例化DbContext時又不提供將種子數據自動加載到內存中且無需手動編輯ModelSnapshot的情況下為遷移提供種子數據?

如果我理解正確,則在保存種子數據之后,您想將DbContext重置為其初始狀態(不包含任何跟蹤的實體)。 如果是這樣,請分離DbContext跟蹤的所有實體:

foreach( var entry in this.ChangeTracker.Entries() )
{
    entry.State = EntityState.Detatched;
}

編輯:

為了解決此問題,僅遷移需要種子數據。 如果你可以使用不同DbContext你的遷移,派生另一個DbContext從當前DbContext與您的遷移使用,只包括了種子數據DbContext

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM