我們正試圖將單元測驗自動化轉移到使用記憶體中的SQLite實體,而不是SQL Server或SQL Express。 我們使用 Entity Framework Core。
我認為我已經正確配置了一切,但是仍然失敗了,所以我一定遺漏了一個步驟,但是我不確定它是什么。
在我們測驗專案的 app.config 中,我指定了:
<connectionStrings>
<add name="BusinessDb" providerName="System. Data.SQLite.EF6" connectionString="data source=:memory:"/>/span>
</connectionStrings>/span>
我們生產的具體類要復雜一些(它在OnModelCreating()方法中多了許多modelBuilder的呼叫,也多了許多DbSet物件,但它基本上是這樣的:
namespace Business.Base.Concrete
{
public class SqlBusinessDb
: DbContext
, IBusinessDb
{
public string ConnectionString { get; set; }
公共SqlBusinessDb(string connectionString)
{
ConnectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder)。
如果(ConnectionString.Contains("memory"))
{
optionsBuilder
.UseLazyLoadingProxies()
.UseSqlite(ConnectionString,
options =>
options.CommandTimeout(SqlSettings.s_CommandTimeoutInSec.CurrentValue)
.MigrationsHistoryTable("_BusinessDB_Migrations"))
.AddInterceptors(new Deals.Base.SQL.SqlPerfCounterInterceptor())。
}
else[/span
{
optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(ConnectionString,
options =>
options.CommandTimeout(SqlSettings.s_CommandTimeoutInSec.CurrentValue)
.MigrationsHistoryTable("_BusinessDB_Migrations")
.EnableRetryOnFailure())
.AddInterceptors(new Deals.Base.SQL.SqlPerfCounterInterceptor())。
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder)。
modelBuilder.Has<BillingPlan>()
.HasManyToOne(p => p.Companies, a =>/span> a. BillingPlan, a =>/span> a.BillingPlan_Id)
}
public int ExecuteStoreCommand(string commandText, params object[] parameters)
{
return Database.ExecuteSqlRaw(commandText, parameters);
}
public DbSet<Features.FeatureOverride_Plan> FeaturesPlan { get; set; }
public DbSet<Business> Businesses { get; set; }
}
在我們的測驗專案中,我們這樣呼叫它:
public static TestBusinessDb GetInstance()
{
SqlBusinessDb realRepository = new SqlBusinessDb()。
如果(!_hasBeenMigrated)
{
_hasBeenMigrated = true。
DatabaseFacade dbf = realRepository.Database;
var issqlite = dbf.IsSqlite()。
var tables = dbf.ExecuteSqlRaw("SELECT * FROM information_schema.table;");
// for測驗庫。我們遷移一次 當我們 第一次嘗試 和連接。
realRepository.Database.Migrate()。
}
這段代碼在 "dbf.ExecuteSqlRaw() "一行中失敗了:
Microsoft.Data.Sqlite.SqliteException : SQLite Error 1: 'no such table: information_schema.tables'.
如果我洗掉這一行,它在以下情況下會失敗。realRepository.Database.Migrate(); with
Microsoft.Data.Sqlite.SqliteException : SQLite Error 1: 'no such table: _BusinessDB_Migrations'.
在除錯時,它成功地運行了 OnConfiguring 和 OnModelCreating 方法,我看著它執行了一個創建該表的 SQL 命令。dbf.ProviderName 回傳 "Microsoft.EntityFrameworkCore.Sqlite"。那么,為什么沒有找到這些表呢?是否有其他需要到位的東西是我所遺漏的?
uj5u.com熱心網友回復:
事實證明,無論如何SQLite都無法處理遷移,所以它不是一個可行的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309803.html
標籤:
上一篇:Sqlite從多個表中選擇
