26

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

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

4

6 回答 6

18

好吧,我终于完成了这项工作: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 分配的值。

于 2009-06-04T19:59:53.277 回答
13

万岁...我找到了解决方案!

  1. 在您的 create table 语句中将 ID 列声明为 INTEGER PRIMARY KEY AUTOINCREMENT。整数主键不起作用!
  2. 在 Visual Studio 中更新您的实体框架模型,将 ID 列属性 StoreGeneratedPattern 设置为“Computed”
于 2010-06-19T21:36:14.957 回答
5

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

图片

于 2012-06-10T11:32:42.430 回答
3

我对 EF 和 SQLite 也有同样的问题。尝试检查第二个帖子: http ://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

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

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

(添加了StoreGeneratedPattern="Identity"

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

于 2009-07-07T10:58:09.187 回答
1

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

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

我相信这就是需要在列定义中设置 AUTOINCREMENT 的原因。

于 2010-11-12T20:20:04.743 回答
0

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

首先对于数据库,右键单击 EDMX 设计器中的列并将其设置StoreGeneratedPatternIdentity.

于 2017-07-24T02:16:17.930 回答