无法使用Entity Framework 5在SQLite数据库中插入记录

时间:2012-07-18 10:47:02

标签: sqlite entity-framework-4.1

我尝试使用ADO.NET Entity Framework 5来使用SQLite数据库,我能够连接到SQLite数据库,并能够从数据库中的表中查询记录。但是当我尝试将记录插入表格时, SaveChanges 会引发异常

"An error occurred while updating the entries. See the inner exception for details."

代码如下所示:

      var connectionStr = string.Format("data source={0};Version=3;UseUTF16Encoding=True;",
                                        fileName);
      var conn = new SQLiteConnection(connectionStr);

      this.personDataContext = new PersonDataContext(conn);

      var persons = (from person in File.ReadAllLines(fileName)
                       let p = person.Split(new[] { ',', ' ' },
                                            StringSplitOptions.RemoveEmptyEntries)
                       select new Person
                                {
                                  ID = Convert.ToInt32(p[0]),
                                  Name = p[1],
                                  Address = p[2],
                                  MobNo = Convert.ToInt32(p[3]),
                                  PhNo = Convert.ToInt32(p[4]),
                                  Designation = p[5]
                                }).ToList();

        if (
            (this.personDataContext !=null)
            &&
            (this.personDataContext.Persons != null)
           )
        {
          foreach (var person in persons)
          {
            this.personDataContext.Persons.Add(person);
          }

          var saveFailed = false;

      do
      {
        try
        {
          this.personDataContext.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
          saveFailed = true;

          ex.Entries.Single().Reload();
        }
      }
      while (saveFailed);
        }

当我检查内部异常时,它说主键没有定义。因此,在将主键定义到表中之后,每次都会出现相同的异常。

我正在附加示例应用here。使用Open Db首先打开示例数据库,然后尝试导入CSV文件。

我正在使用Code First方法,我在其中设计了一个Model类并将其与SQLite数据库中的表连接。

请帮助解决问题。谢谢!

1 个答案:

答案 0 :(得分:1)

尝试在Person类中禁用密钥属性的数据库生成标识:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set; }

对我而言,您似乎希望手动提供键值(ID = Convert.ToInt32(p[0])),但EF不会将此值发送到数据库,因为默认情况下它期望在{...}}中生成ID值。数据库。如果未在DB中生成,则会出现异常。通过将DatabaseGeneratedOption设置为None EF将获取您提供的值并将其在INSERT语句中发送到数据库。