實體框架7和SQLite表沒有創建

c# entity-framework-core sqlite

我已經嘗試了一段時間來弄清楚如何使用單個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異常。

[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);
    }
}

我幾乎可以保證這是一個簡單的我缺少但我似乎無法找到它,並且我沒有在他們的文檔中找到任何示例。似乎在GitHub上提交了類似的問題https://github.com/aspnet/EntityFramework/issues/2874但這適用於多個上下文。那麼也許這是另一件尚未完全釋放的作品呢?

按照http://nate.readthedocs.org/en/latest/getting-started/uwp.html上發布的教程,按照@natemcmaster的建議和@ lukas-kabrt推薦的解決方案,我能夠將它作為期望。通過運行以下命令,我能夠創建表並從中插入/選擇數據。

[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);
    }
}

一般承認的答案

DbContext類包含數據庫的配置 - 表,關係等。要使用DbContext您需要創建一個與DbContext匹配的數據庫。在Code-first世界中,它是由數據庫遷移完成的。

對於ASP.NET 5,您需要將此配置添加到project.json文件中

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

然後將遷移添加到項目中,並通過運行以下命令將此遷移應用於DB

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

對於完整.NET,您需要在程序包管理器控制台中運行以下命令(工具 - NuGet程序包管理器 - 程序包管理器控制台)

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

熱門答案

在官方文檔中查看UWP入門 - EF 7 。以下註釋來自該文件。

UWP上的默認路徑不可寫。您的DB文件需要位於ApplicationData.Current.LocalFolder

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

另請注意,在UWP上,您無法從命令運行遷移。您需要在應用程序中運行它們。

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因