Entity Framework 7和SQLite表未创建

4

我一直在尝试使用单个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
2个回答

5

请查看官方文档中有关 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();
        }

这非常有帮助!它似乎正好做我需要的事情! - CGideon

3

DbContext 类包含你的数据库的配置 - 表,关系等。要使用 DbContext ,你需要创建一个与你的 DbContext 匹配的数据库。在 Code-first 的世界中,这是通过数据库迁移完成的。

对于 ASP.NET 5,你需要将这个配置添加到你的 project.json 文件中。

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

然后在您的项目中添加一个迁移,并通过运行以下命令将此迁移应用于数据库

dnx ef migrations add MyFirstMigration
dnx ef database update 

要使用完整的 .NET,您需要在 包管理器控制台 中运行以下命令(工具 ‣ NuGet 包管理器 ‣ 包管理器控制台):

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

感谢@lukas-kabrt。在我们实际使用的WPF应用程序中,我们没有package.json文件。这个文件是放在项目根目录还是app.xaml所在的位置?此外,这个应用程序是通过msi安装程序分发的,有没有一种方法可以在不使用命令行的情况下运行这些命令,并通过代码完成呢? - CGideon
此外,如果使用ASP.NET Core,请在CLI上使用dotnet而不是dnx。 - sudheeshix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接