Я пытаюсь получить 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
Я думаю, что я, наконец, получил мой файл 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 следует из работающей правильно настроенной базы данных.
Заранее благодарим за любую помощь, которую вы можете мне предложить.
Я удалил свой ответ, поскольку он был неправильным, но нашел этот вопрос: http://stackoverflow.com/questions/22174212/entity-framework-6-with-sqlite-3-code-first-wont-create- таблицы, по-видимому, нарушены EF6 SQLite. – Steve
Также вы используете SQLite или MySQL? Вы, кажется, ссылаетесь на оба в разных местах. – Steve
sqlite ... Извините, я пару раз ошибался, как MySQL. Под редакцией! –