实体框架7和SQLite表未创建

本文关键字:创建 SQLite 框架 实体 | 更新日期: 2023-09-27 18:20:35

我已经尝试了一段时间,想知道如何使用单个DBContext以"代码优先"的方式创建多个表,但没有任何运气。我确信这只是我对框架不熟悉,但我不确定我遗漏了什么。下面是一个包含实体和DBContext的简单示例。

[Table("MyEntity")]
public class MyEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}
[Table("MySecondEntity")]
public class MySecondEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}
public class MyContext : DbContext
{
    public DbSet<MyEntity> MyTable { get; set; }
    public DbSet<MySecondEntity> MyTable2 { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = "test.db"};
        var connectionString = connectionStringBuilder.ToString();
        var connection = new SqliteConnection(connectionString);
        optionsBuilder.UseSqlite(connection);
    }
}

在我看来,它应该可以工作,但当我在下面的代码中调用它时,当遇到第一个foreach循环时,它会出现一个"no such table:MyEntity"Sqlite异常。

static void Main(string[] args)
    {
        using (var db = new MyContext())
        {
            MyEntity testEntity1 = new MyEntity();
            MySecondEntity entity1 = new MySecondEntity();
            testEntity1.MyColumn = "Test Data 1";
            testEntity1.MyNumber = 12345;
            db.MyTable.Add(testEntity1);
            db.Database.Migrate();
            entity1.MyColumn = "New Data 1";
            entity1.MyNumber = 2;
            db.MyTable2.Add(entity1);
            db.Database.Migrate();
            Console.WriteLine("Inserting Data...");
            Console.WriteLine("Data in the Database");
            foreach (var entity in db.MyTable)
            {
                Console.WriteLine("Id: " + entity.Id);
                Console.WriteLine("Column Data: " + entity.MyColumn);
                Console.WriteLine("Number: " + entity.MyNumber);
            }
            foreach (var entity in db.MyTable2)
            {
                Console.WriteLine("Id: " + entity.Id);
                Console.WriteLine("Column Data: " + entity.MyColumn);
                Console.WriteLine("Number: " + entity.MyNumber);
            }
        }
        Console.WriteLine("Examples run finished,press Enter to continue...");
        Console.ReadLine();
    }  

我几乎可以保证我遗漏了一些简单的东西,但我似乎找不到,而且在他们的文档中也找不到任何例子。GitHub上似乎也提交了类似的问题https://github.com/aspnet/EntityFramework/issues/2874但这是针对多个上下文的。所以,也许这是另一部还没有发布的作品?

解决方案

按照上发布的教程http://ef.readthedocs.org/en/latest/getting-started/uwp.html正如@natemcaster和@lukas-kabrt推荐的解决方案所建议的那样,我能够使它按需工作。通过运行以下命令,我能够获得创建的表,并从中插入/选择数据。

Install-Package EntityFramework.Commands –Pre
Add-Migration MyFirstMigration
Update-Database

实体框架7和SQLite表未创建

查看官方文档中的《UWP-EF 7入门》。以下注释来自该文件。

UWP上的默认路径是不可写的。您的数据库文件需要在ApplicationData.Current.LocalFolder

options.UseSqlite("Data Source=" + Path.Combine(ApplicationData.Current.LocalFolder.Path, "blogging.db"))

另外,请注意,在UWP上,您不能从命令运行迁移。你需要在应用程序中运行它们。

       using (var db = new BloggingContext())
        {
            db.Database.Migrate();
        }

DbContext类包含数据库的配置-表、关系等。要使用DbContext,您需要创建一个与DbContext匹配的数据库。在代码第一的世界里,它是通过数据库迁移来完成的。

对于ASP.NET 5,您需要将此配置添加到project.json文件中

"commands": {
    "ef": "EntityFramework.Commands"
}

然后将迁移添加到您的项目中,并通过运行以下命令将此迁移应用到DB

dnx ef migrations add MyFirstMigration
dnx ef database update 

对于完整的.NET,您需要在软件包管理器控制台(ToolsŞNuGet软件包管理程序控制台)中运行以下命令

Install-Package EntityFramework.Commands –Pre
Add-Migration MyFirstMigration
Update-Database