2011-11-15 37 views
20

Tôi đang cố tạo một cơ sở dữ liệu SQLite được nhúng với EF, tuy nhiên, tôi không thể làm việc đó, tệp cơ sở dữ liệu không bao giờ được tạo ra.HOWTO: SQLite với EntityFramework và Code-First

Tôi có EF 4.2 và phiên bản mới nhất SQLite

Dưới đây là những gì tôi có

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 initializer (để đưa một số nội dung trong)

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

Và cuối cùng trong chính()

Database.SetInitializer(new PageDbInitializer()); 

Tôi tin rằng tôi có một số bước mất tích, nhưng không thể tìm thấy chúng ra.

+0

Chỉ vì tò mò, bạn đã làm gì? bạn đã sử dụng nhà cung cấp devart hay tìm một giải pháp khác? –

+0

@StellaMusik Tôi đã kết thúc bằng cách sử dụng SQLExpress trong thời gian này, nhưng bạn luôn có thể sử dụng mô hình hoặc cơ sở dữ liệu đầu tiên với SQLlite –

+0

@PierlucSS phải đối mặt với cùng một vấn đề. Tôi không muốn sử dụng Devart vì vậy rõ ràng nó sẽ là model đầu tiên –

Trả lời

23

System.Data.SQLite hiện đang ở phiên bản hiện tại chỉ nhà cung cấp tương thích EFv1 (1, 2). Nó có nghĩa là nó không có EFv4 (EFv4.2 là bao bọc quanh EFv4) bao gồm cả việc tạo và xóa cơ sở dữ liệu (kiểm tra DbProviderServices sự khác biệt đối với .NET 3.5 và .NET 4.0 trong MSDN). Do đó, bạn không thể sử dụng tạo cơ sở dữ liệu tự động bằng mã trước khi làm việc với SQLite. Bạn phải tạo cơ sở dữ liệu và tất cả các bảng theo cách thủ công.

Thay vào đó, bạn có thể sử dụng nhà cung cấp khác nhau cho SQLite. Ví dụ: Devart's SQLite provide r tuyên bố nó hỗ trợ EFv4 và 4.1 và do đó tạo cơ sở dữ liệu.

+20

Vì đây là một bài đăng cũ, bạn có biết nếu đây vẫn là câu trả lời hợp lệ không? Tôi hiện đang cố gắng tìm thông tin về điều này và trong tiến trình nghiên cứu của tôi, có vẻ như điều này vẫn đúng (nhưng tôi không chắc chắn) – Default

+0

Tôi có thể xác minh rằng tôi thậm chí vẫn không thể tạo cơ sở dữ liệu với nhà cung cấp sqlite hiện tại. – user3141326

+0

@ user3141326: Bạn có thể thử EF Core (aka EF 7) không? Nó phải có xây dựng trong nhà cung cấp cho SQLite. –

8

Kiểm tra này ra:

https://github.com/msallin/SQLiteCodeFirst

Cũng sẵn như là một NuGet

Nó cho biết thêm một số DB Initializers để ptoject của bạn, chẳng hạn như SqliteCreateDatabaseIfNotExists

Dưới đây là ví dụ của trang web:

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); 
    } 
} 
Các vấn đề liên quan