Почему таблица не существует, пока я создаю базу данных sqlite в памяти с ядром entityframework? - PullRequest
0 голосов
/ 30 января 2020

Я хочу создать базу данных SQLite в памяти.

Вот startup.cs:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();            
            services.AddDbContext<TestDBContext>().AddEntityFrameworkSqlite();
        }

Вот модель базы данных:

 public class TestModel
    {
        public string UserName { get; set; }        
        [Key]
        public string id { get; set; }
    }

Вот DBContext базы данных:

 public class TestDBContext : DbContext
    {
        public virtual DbSet<TestModel> Test { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=:memory:");
        }
    }

А вот контроллер:

private readonly TestDBContext TestDBContext;

 public HomeController(ILogger<HomeController> logger,TestDBContext _TestDBContext)
        {
            _logger = logger;
            this.TestDBContext = _TestDBContext;
        }

    public IActionResult Index()
    {
        TestDBContext.Database.EnsureCreated();            
        TestDBContext.SaveChanges();
        TestDBContext.Test.Add(new TestModel() { User = DateTime.Now.ToString(),id=Guid.NewGuid().ToString() });
        TestDBContext.SaveChanges();
        return View(TestDBContext.Test.ToList());
    }

Каждый раз, когда он работает, он сообщит об ошибке:

Inner Exception 1:
SqliteException: SQLite Error 1: 'no such table: Test'.

Я использовал EnsureCreated и EnsureCreated работает без ошибок. Почему все еще так?

Ответы [ 2 ]

3 голосов
/ 30 января 2020

Eb Core DbContext всегда открывает и закрывает соединения с базой данных автоматически, если вы не пропустите уже открытое соединение. И когда соединение закрывается, база данных Sqlite In-memory будет удалена. Поэтому я немного изменил ваш код следующим образом.

public void ConfigureServices(IServiceCollection services)
{
    var connection = new SqliteConnection("datasource=:memory:");
    connection.Open();

    services.AddControllersWithViews();
    services.AddDbContext<TestDBContext>(options =>
    {
        options.UseSqlite(connection);
    });
}

И класс Database Context - я добавил конструкторы, чтобы я мог предоставить параметры.

public class TestDBContext : DbContext
{
    public TestDBContext(DbContextOptions options) : base(options)
    {
    }

    protected TestDBContext()
    {
    }

    public virtual DbSet<TestModel> Test { get; set; }
}

И вместо создать базу данных в методе действия Index, создать ее при запуске.

0 голосов
/ 30 января 2020

Кроме того, решите использовать метод DbContext.Database.Migrate() вместо EnsureCreated, иначе вы не сможете использовать миграции позже.

...