使用 SQLite 时,我在实体框架中遇到主键问题。SQLite 希望在自动递增主键列的 VALUES 列表中显式 NULL。我实际上并没有查看 EF 上下文中生成的 SQL,但我相信它符合通常的 SQL Server 约定,即不为自动增量列提供任何值。
根据 ADO.NET SQLite 提供程序的站点,完全支持 EF,但我在那里找不到任何帮助。有没有办法强制 EF 为主键值显式插入 NULL?
使用 SQLite 时,我在实体框架中遇到主键问题。SQLite 希望在自动递增主键列的 VALUES 列表中显式 NULL。我实际上并没有查看 EF 上下文中生成的 SQL,但我相信它符合通常的 SQL Server 约定,即不为自动增量列提供任何值。
根据 ADO.NET SQLite 提供程序的站点,完全支持 EF,但我在那里找不到任何帮助。有没有办法强制 EF 为主键值显式插入 NULL?
好吧,我终于完成了这项工作:D。您需要将 id 列设置为自动增量,这样它就可以与 EF 一起使用。不要问我为什么在 sqlite 常见问题解答中关于自动增量的问题中没有提到这一点。这是一个例子:
create table Persona ( PersonaID integer primary key autoincrement, Nombre text)
另外,我没有找到从 Visual Studio 中设置它的方法,我必须从命令行工具中进行设置。
更新:以下代码工作正常。
PruebaDBEntities data = new PruebaDBEntities();
foreach (int num in Enumerable.Range(1, 1000))
{
Persona p = new Persona() { Nombre = "Persona " + num, Edad = num };
data.AddToPersona(p);
data.SaveChanges();
Console.WriteLine(p.PersonaID);
}
PersonaID 未设置,在保存操作后,它具有由 sqlite 分配的值。
万岁...我找到了解决方案!
您必须将自动增量设置为 True。您可以在设计表窗口中通过单击工具栏中的(管理索引和键)图标直接从 VS 进行此操作,然后更新您的模型。
我对 EF 和 SQLite 也有同样的问题。尝试检查第二个帖子: http ://sqlite.phxsoftware.com/forums/p/1418/6162.aspx
我的问题的原因是自动增量被添加到数据库本身,但实体模型没有正确刷新。所以刷新后,我的字段看起来像这样:
<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
(添加了StoreGeneratedPattern="Identity")
在刷新之前(使用旧模型),我只是尝试将 id 属性设置为 0,效果也很好:)
在“SQLite 权威指南”一书中,我在主键约束下阅读了以下内容:
“然而,实际上,此列只是 ROWID 的别名。它们都将引用相同的值。”
我相信这就是需要在列定义中设置 AUTOINCREMENT 的原因。
SQLite 的 EF 提供程序似乎没有将该列作为标识(自动增量)。
首先对于数据库,右键单击 EDMX 设计器中的列并将其设置StoreGeneratedPattern
为Identity
.