2011-11-15 75 views
20

我試圖用EF創建一個嵌入式SQLite數據庫,但是我無法讓它工作,數據庫文件永遠不會被創建。HOWTO:具有EntityFramework和Code-First的SQLite

我有EF 4.2和最新版本的SQLite

這裏是我有什麼

的app.config

<?xml version="1.0"?> 
<configuration> 
    <system.data> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SQLite"/> 
     <add name="SQLite Data Provider" 
      invariant="System.Data.SQLite" 
      description=".Net Framework Data Provider for SQLite" 
      type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/> 
    </DbProviderFactories> 
    </system.data> 
    <connectionStrings> 
    <add name="DataContext" 
     connectionString="Data Source=test.db;Version=3;New=True;" 
     providerName="System.Data.SQLite" /> 
    </connectionStrings> 
    <startup> 
    <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

DB初始化(把一些內容)

class PageDbInitializer : DropCreateDatabaseAlways<PageDB> 
{ 
    protected override void Seed(PageDB context) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      WebPage page = new WebPage() { Name = "Page" + (i + 1) }; 
      context.Pages.Add(page); 
     } 
     base.Seed(context); 
    } 
} 

的DbContext:

class PageDB : DbContext 
{ 
     public DbSet<WebPage> Pages { get; set; } 
} 

最後在main()

Database.SetInitializer(new PageDbInitializer()); 

我相信我有一些步驟失蹤,卻找不到他們。

+0

出於好奇,你最終做了什麼?您是否使用devart供應商或尋找其他解決方案? –

+0

@StellaMusik我最終結束了使用SQLExpress,但您始終可以使用SQLlite –

+0

@PierlucSS首先使用模型或數據庫面臨同樣的問題。我不想使用Devart的顯然它將成爲模型第一 –

回答

23

System.Data.SQLite是僅當前版本EFv1兼容提供商(1,2)。這意味着它沒有EFv4(EFv4.2是EFv4的包裝)功能,包括數據庫創建和刪除(請檢查DbProviderServices與.NET 3.0和.NET 4.0的差異MSDN)。因此,使用SQLite時,不能使用代碼優先自動創建數據庫。您必須手動創建數據庫和所有表。

作爲替代方案,您可以使用不同的SQLite提供程序。例如Devart's SQLite provide r聲稱它支持EFv4和4.1,從而創建數據庫。

+20

由於這是一箇舊的職位,你知道這是否仍然是一個有效的答案嗎?我目前正試圖找到關於這方面的信息,並在我的研究進展中,它看起來似乎仍然如此(但我不確定) – Default

+0

我可以驗證我甚至不能用當前的sqlite提供程序創建數據庫。 – user3141326

+0

@ user3141326:你可以試試EF Core(aka EF 7)嗎?它應該建立在SQLite的提供者中。 –

8

檢查了這一點:

https://github.com/msallin/SQLiteCodeFirst

也可作爲NuGet

它增加了一些DB初始值設定您ptoject,如SqliteCreateDatabaseIfNotExists

下面是該網站的例子:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() 
     : base("ConnectionStringName") { } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(
      Database.Connection.ConnectionString, modelBuilder); 
     Database.SetInitializer(sqliteConnectionInitializer); 
    } 
} 
相關問題