我尝试使用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数据库中的表连接。
请帮助解决问题。谢谢!
答案 0 :(得分:1)
尝试在Person
类中禁用密钥属性的数据库生成标识:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set; }
对我而言,您似乎希望手动提供键值(ID = Convert.ToInt32(p[0])
),但EF不会将此值发送到数据库,因为默认情况下它期望在{...}}中生成ID
值。数据库。如果未在DB中生成,则会出现异常。通过将DatabaseGeneratedOption
设置为None
EF将获取您提供的值并将其在INSERT语句中发送到数据库。