Entity Framework 6 没有在 SQLite 数据库中创建表
Entity Framework 6 not creating tables in SQLite database
我正在尝试让 System.Data.SQLite 与 Entity Framework 6 一起工作,在我的 C#.NET (4.5.2) WPF 项目中使用代码优先方法。
我已经查看并尝试按照以下位置(以及其他地方)中的说明进行操作,但它们似乎已经过时,对于不同的 dbms,而不是代码优先,或者以上。
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: -->
<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: -->
<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; }
}
我的数据项class如下:
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;
}
}
如我所料,当我实例化 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 中的所有内容都来自正确设置的数据库。
在此先感谢您提供的任何帮助。
根据 Entity Framework 6 with SQLite 3 Code First - Won't create tables,EF6 在与 SQLite 一起使用时不会创建表,因此我必须自己创建表。
我能够使用 DB Browser for SQLite 创建一个 SQLite 数据库,并自己在其中创建表。我必须小心确保我创建的表的结构与我的模型 类 中的属性相匹配,并使用模型 类 上的 [Key] 注释来指示哪个字段是主要字段关键字段。
重要的是,我必须在 Visual Studio 中添加现有项目以获取该文件并确保 Visual Studio 知道该文件。
此外,重要的是,我必须转到该文件的属性并将其 'Copy to Output Directory' 属性 设置为 'Copy if Newer',以便数据库进入 bin/debug 或 bin/release 目录,当我 运行 应用程序时。如果我不这样做,数据库将在 运行 时不存在,这将导致 运行 时崩溃。
我正在尝试让 System.Data.SQLite 与 Entity Framework 6 一起工作,在我的 C#.NET (4.5.2) WPF 项目中使用代码优先方法。
我已经查看并尝试按照以下位置(以及其他地方)中的说明进行操作,但它们似乎已经过时,对于不同的 dbms,而不是代码优先,或者以上。
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: -->
<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: -->
<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; }
}
我的数据项class如下:
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;
}
}
如我所料,当我实例化 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 中的所有内容都来自正确设置的数据库。
在此先感谢您提供的任何帮助。
根据 Entity Framework 6 with SQLite 3 Code First - Won't create tables,EF6 在与 SQLite 一起使用时不会创建表,因此我必须自己创建表。
我能够使用 DB Browser for SQLite 创建一个 SQLite 数据库,并自己在其中创建表。我必须小心确保我创建的表的结构与我的模型 类 中的属性相匹配,并使用模型 类 上的 [Key] 注释来指示哪个字段是主要字段关键字段。
重要的是,我必须在 Visual Studio 中添加现有项目以获取该文件并确保 Visual Studio 知道该文件。
此外,重要的是,我必须转到该文件的属性并将其 'Copy to Output Directory' 属性 设置为 'Copy if Newer',以便数据库进入 bin/debug 或 bin/release 目录,当我 运行 应用程序时。如果我不这样做,数据库将在 运行 时不存在,这将导致 运行 时崩溃。