【问题标题】:Entity Framework 7 and SQLite Tables not creating实体框架 7 和 SQLite 表未创建
【发布时间】:2016-02-05 05:29:15
【问题描述】:

我一直在尝试弄清楚如何使用单个 DBContext 以 Code First 方式创建多个表,但没有任何运气。我确定这只是我对框架的不熟悉,但我不确定我缺少什么。这是一个包含实体和 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 循环时出现“没有这样的表: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 上提交了一个类似的问题,但这是针对多个上下文的。那么,也许这是另一部尚未完全发布的作品?

解决方案

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

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

【问题讨论】:

    标签: c# sqlite entity-framework-core


    【解决方案1】:

    查看官方文档中的Getting Started on 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();
            }
    

    【讨论】:

    • 这帮了大忙!它似乎完全符合我的需要!
    【解决方案2】:

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

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

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

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

    dnx ef migrations add MyFirstMigration
    dnx ef database update 
    

    对于 Full .NET,您需要在包管理器控制台中运行以下命令(工具 ‣ NuGet 包管理器 ‣ 包管理器控制台)

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

    【讨论】:

    • 感谢@lukas-kabrt 在实际的 WPF 应用程序中需要进入我们没有 package.json 文件。这只是进入项目根目录还是 app.xaml 所在的位置?此外,这是通过 msi 安装程序分发的,有没有办法运行这些命令而无需使用命令行,只需通过代码完成?
    • 补充一点,如果在 ASP.NET Core 上,请在 CLI 上使用 dotnet 而不是 dnx。
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2014-07-28
    • 2017-04-03
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多