【问题标题】:SQLite with Entity FrameworkSQLite 与实体框架
【发布时间】:2010-10-30 12:35:08
【问题描述】:

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

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

【问题讨论】:

  • 我也有同样的情况。我已经尝试更换很长时间了?在生成的代码中,所以我至少可以自己设置 null,但它不起作用。错误消息是:“对数据库的更改已成功提交,但在更新对象上下文时发生错误。ObjectContext 可能处于不一致状态。内部异常消息:定义 EntityKey 的键值对不能为空或为空。\r\n参数名称:记录"。似乎没有办法绕过这一点,处理自动增量的 sqlite 方式有点奇怪。
  • 我放弃了 SQLite 与 EF 的结合。在 System.Data.Sqlite 网站的论坛上有一篇关于这个问题的帖子,但一段时间没有任何动作或回应。我转向 SQL Compact,它提出了自己的问题。您不能使用 EF/SQLCompact 执行“服务器生成的密钥”。所以,现在我为插入做标准的连接/命令式 ADO,我使用 EF 作为 LINQ 糖。
  • 这太糟糕了。我想同样的“技巧”可以在 sqlite 中使用。我已经用 CE 和 linq to sql 测试了自动增量,它似乎可以工作。没有用sqlite尝试过,不确定是否可行。
  • 以下是 EF/CE 的限制列表:technet.microsoft.com/en-us/library/cc835494.aspx
  • 是的,经过考虑,我本可以使用相同的技术继续使用 SQLite...哦,好吧。

标签: entity-framework system.data.sqlite


【解决方案1】:

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

【讨论】:

  • 我在一些贴子中看到了,但是你不是必须在主键的INSERT语句中显式输入一个NULL吗? “INSERT INTO Persona VALUES('Pablo')”不起作用,你必须做“INSERT INTO Persona VALUES(NULL,'Pablo')”对吗?
  • 我已经回复了帖子,所以代码可以很好地格式化。
【解决方案2】:

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

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

【讨论】:

  • 我刚做了你的第一步,然后删除并创建了我的 EF 模型。而已。实际上 StoreGeneratedPattern 现在设置为“身份”。它现在正在工作。
  • 我还通过将StoreGeneratedPattern 设置为“身份”来让它飞起来
【解决方案3】:

您必须将 autoincrement 设置为 True。 您可以直接在 VS 中完成此操作,方法是在设计表窗口中单击工具栏中的(管理索引和键)图标,然后更新您的模型。

【讨论】:

    【解决方案4】:

    我在使用 EF 和 SQLite 时遇到了同样的问题。 尝试检查第二个帖子: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

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

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

    (已添加StoreGeneratedPattern="Identity")

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-28
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          相关资源
          最近更新 更多