2016-02-10 7 views
6

Я пытаюсь получить System.Data.SQLite для работы с Entity Framework 6, используя подход Code First в моем проекте WPF на C# .NET (4.5.2).Entity Framework 6 не создает таблицы в базе данных SQLite

Я просмотрел и попытался следовать инструкциям в следующих местах (среди прочего), но они кажутся либо устаревшими, но и для других dbms, а не для кода First, или какой-либо комбинации выше ,

https://msdn.microsoft.com/en-us/data/jj592674

https://msdn.microsoft.com/en-us/data/jj592674.aspx

http://nullskull.com/a/10476742/sqlite-in-wpf-with-entity-framework-6.aspx

Entity Framework 6 + SQLite

Я думаю, что я, наконец, получил мой файл App.config правильно настроен следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <!-- from: https://stackoverflow.com/questions/14510096/entity-framework-6-sqlite --> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
     <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
    </providers> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 
    <connectionStrings> 
    <add name="MyDatabase" connectionString="Data Source=.\DataFile\myDatabase.sqlite" providerName="System.Data.SQLite" /> 
    </connectionStrings> 
    <system.data> 
    <!-- from: https://stackoverflow.com/questions/14510096/entity-framework-6-sqlite --> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SQLite.EF6" /> 
     <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> 
     <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> 
</configuration> 

Мое определение DbContext выглядит следующим образом:

public class MyDataContext : DbContext 
{ 
    public MyDataContext() : base("name=MyDatabase") 
    { 
    } 
    public DbSet<DataItem> DataItems { get; set; } 
} 

Мой класс DataItem выглядит следующим образом:

public class DataItem 
{ 
    [Key] 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

И я пытаюсь вызвать контекст так:

using (var db = new MyDataContext()) 
{ 
    DataItem item = new DataItem { MyInt = 19, MyString = "nineteen" }; 
    db.DataItems.Add(item); 
    try 
    { 
     db.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     var x = ex.InnerException; 
     Debug.WriteLine("Inner Exception: {0}", x); 
     throw; 
    } 

} 

В I ожидать, когда я создаю экземпляр MyDataContext, файл myDatabase.sqlite будет создан в моем bin\debug\DataFile каталоге. Однако, когда я пытаюсь позвонить db.SaveChanges(), исключение поймано.

InnerException этого исключения является System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SQLite.SQLiteException: SQL logic error or missing database no such table: DataItems

Когда я смотрю в каталог DataFile, файл myDatabase.sqlite равен нулю байтов. Это говорит мне, что, хотя DbContext обнаружил правильное имя файла для нового файла базы данных из файла app.config, он не создавал свои первые строки кодов в базе данных, как предполагалось.

Есть ли что-то очевидное, что я здесь отсутствует? Все примеры предполагают, что этот (чрезвычайно критический) шаг работает, и все в EF6 следует из работающей правильно настроенной базы данных.

Заранее благодарим за любую помощь, которую вы можете мне предложить.

+1

Я удалил свой ответ, поскольку он был неправильным, но нашел этот вопрос: http://stackoverflow.com/questions/22174212/entity-framework-6-with-sqlite-3-code-first-wont-create- таблицы, по-видимому, нарушены EF6 SQLite. – Steve

+0

Также вы используете SQLite или MySQL? Вы, кажется, ссылаетесь на оба в разных местах. – Steve

+0

sqlite ... Извините, я пару раз ошибался, как MySQL. Под редакцией! –

ответ

4

Согласно Entity Framework 6 with SQLite 3 Code First - Won't create tables, EF6 не создает таблицы при использовании с SQLite, поэтому я должен был сделать это сам.

Мне удалось создать базу данных SQLite с помощью DB Browser for SQLite и создать сами таблицы в ней. Я должен был быть осторожным, чтобы структура созданных таблиц соответствовала свойствам в классах Model и использовала аннотацию [Key] в классах Model, чтобы указать, какое поле является полем первичного ключа.

Важно отметить, что мне пришлось добавить существующий элемент в Visual Studio, чтобы захватить этот файл и убедиться, что Visual Studio знает о файле.

Также важно, чтобы мне пришлось перейти к свойствам этого файла и установить его свойство «Копировать в выходной каталог» в «Копировать, если новый», чтобы база данных пробивалась к bin/debug или bin/когда я запускаю приложение.Если бы я этого не сделал, база данных не существовала бы во время выполнения, что может привести к сбою во время выполнения.

+2

вам понадобилось: https://github.com/msallin/SQLiteCodeFirst - он был связан с вопросом: https://stackoverflow.com/a/29460684/492 –

Смежные вопросы