EF Core、Sqlite、InMemory、Code First - 只是如何实现?

Har*_*rry 2 c# sqlite entity-framework-core

我想创建一个具有测试模型结构的数据库。在记忆中。使用 Sqlite 和 Entity Framework Core。当然,先写代码。我创建了我的模型。

Data\DataContext.cs:

using Microsoft.EntityFrameworkCore;

namespace MyTest.Data {

    public class DataContext : DbContext {

        public DbSet<Record> Records { get; set; }

        public DataContext(DbContextOptions options) : base(options) { }

    }

}
Run Code Online (Sandbox Code Playgroud)

Data\Record.cs:

using System;

namespace MyTest.Data {

    public class Record {

        public int Id { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }

        public DateTime Time { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

我有这个测试代码:

using System;
using System.Data.Common;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;

using MyTest.Data;

namespace MyTest {
    
    public class Startup {
        
        static DbConnection TestDbConnection = new SqliteConnection("Data Source=:memory:;Cache=shared");

        void InitializeTestDatabase() {
            var dbOptions = new DbContextOptionsBuilder().UseSqlite(TestDbConnection).Options;
            var dbContext = new DataContext(dbOptions);
            dbContext.Database.EnsureCreated();
            for (int i = 0; i < 1024; i++) {
                var testString = Guid.NewGuid().ToString();
                dbContext.Records.Add(new Record { Name = testString.Substring(0, 8), Description = testString, Time = DateTime.Now });
            }
            dbContext.SaveChanges();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

当然它会抛出SQL异常,因为没有像“Records”这样的表。明显地。该结构通常是通过迁移创建的,但我读到您不能将迁移与InMemory. 我应该用它EnsureCreated()来代替。但是我怎样才能从我的模型代码构建结构呢?我在这里缺少什么?

Gur*_*ron 12

我需要SqliteConnection.Open在我的连接上添加调用才能使其正常工作:

var conn = new SqliteConnection("DataSource=:memory:");
conn.Open(); // open connection to use

var options = new DbContextOptionsBuilder<VegaDbContext>()
   .UseSqlite(conn)
   .Options;

using (var ctx = new VegaDbContext(options))
{
    ctx.Database.EnsureCreated();
    ctx.Records.ToList();
}
Run Code Online (Sandbox Code Playgroud)