2

我尝试使用 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);
}

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

我在此处附上示例应用程序。首先使用 Open Db 打开示例数据库,然后尝试导入 CSV 文件。

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

请帮助解决问题。谢谢!

4

1 回答 1

2

尝试为Person类中的关键属性禁用数据库生成的身份:

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

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

于 2012-07-18T14:08:10.970 回答