SQLite与实体框架

时间:2009-06-01 21:12:37

标签: entity-framework system.data.sqlite

使用SQLite时,我在Entity Framework中遇到主键问题。 SQLite希望在自动增量主键列的VALUES列表中显式为NULL。我实际上没有看过EF上下文中生成的SQL,但我相信它与通常的SQL Server约定一致,即不为自动增量列提供任何值。

根据ADO.NET SQLite提供程序的site,完全支持EF,但我找不到任何帮助。有没有办法强制EF为主键值显式插入NULL?

6 个答案:

答案 0 :(得分:18)

好吧,我终于完成了这项工作:D。您需要将id列设置为autoincrement,这样它就可以与EF一起使用。不要问我为什么在sqlite faq中关于自动增量的问题中没有提到这一点。这是一个例子:

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指定的值。

答案 1 :(得分:13)

万岁......我找到了解决办法!

  1. 在create table语句中将ID列声明为INTEGER PRIMARY KEY AUTOINCREMENT。 INTEGER PRIMARY KEY无效!
  2. 在Visual Studio中更新您的实体框架模型,将ID列属性StoreGeneratedPattern设置为“Computed”

答案 2 :(得分:5)

您必须将自动增量设置为True。 您可以在设计表窗口中单击工具栏中的(管理索引和键)图标直接从VS 创建此项,然后更新您的模型。

image

答案 3 :(得分:3)

我和EF和SQLite有同样的问题。 尝试检查第二篇文章: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

我的问题的原因是自动增量已添加到数据库本身,但实体模型未正确刷新。所以在刷新之后,我的字段看起来像这样:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />

StoreGeneratedPattern =“身份”已添加)

在刷新之前(使用旧模型),我只是尝试将id属性设置为0,这也有效:)

答案 4 :(得分:1)

从书中,“SQLite权威指南”我在主键约束下阅读了以下内容:

“但实际上,此列只是ROWID的别名。它们都将引用相同的值。”

我认为这是需要在列定义中设置AUTOINCREMENT的原因。

答案 5 :(得分:0)

似乎SQLite的EF提供程序没有将该列作为标识(自动增量)获取。

首先,对于数据库,右键单击EDMX设计器中的列,然后将StoreGeneratedPattern设置为Identity