我正在尝试将一些数据插入到我的SQLite数据库中,当我用一条记录完成这一工作时,这个数据库就能很好地工作。但是在一个循环中,我得到了一个错误。首先,这是代码
string dataSource = "Data Source=";
Connection = new SQLiteConnection(dataSource + this.DatabasePath);
var context = new DataContext(Connection);
var users = context.GetTable<User>();
for (int i = 0; i < 2; i++) {
User tempUser = new User() {
ID = null,
EMail = i + "@" + i + ".de",
Password = "Test1234",
JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
};
users.InsertOnSubmit(tempUser);
context.SubmitChanges();
}和用户本身
[Table(Name = "User")]
public class User {
[Column(Name = "UserID", IsPrimaryKey = true, CanBeNull = false)]
public int? ID { get; set; }
[Column(Name = "EMail", CanBeNull = false)]
public string EMail { get; set; }
[Column(Name = "Password", CanBeNull = false)]
public string Password { get; set; }
[Column(Name = "JoinedDate", CanBeNull = false)]
public String JoinedDate { get; set; }
[Column(Name = "PaymentMethodID")]
public int PaymentMethodID { get; set; }
}表是这样创建的
CREATE TABLE "User" (
`UserID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`EMail` TEXT NOT NULL,
`Password` TEXT NOT NULL,
`JoinedDate` TEXT NOT NULL,
`Licenses` INTEGER,
`PaymentMethodID` INTEGER
)最后,我得到的错误是:
“System.Data.Linq.DuplicateKeyException”类型的异常发生在System.Data.Linq.dll中,但未在用户代码中处理 补充资料: Eine Entit t,deren Schlüssel bereits verwendet,kann nicht hinzugefügt werden。
我可以打赌,这是因为字段ID,它被设置为AutoIncrement。
发布于 2016-05-11 12:24:46
假设您的代码在一次插入时运行良好,我将尝试以下解决方案之一。
解决方案1
在循环外调用context.SubmitChanges();
所以
for (int i = 0; i < 2; i++) {
User tempUser = new User() {
ID = null,
EMail = i + "@" + i + ".de",
Password = "Test1234",
JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
};
users.InsertOnSubmit(tempUser);
}
context.SubmitChanges();解决方案2
使用InsertAllOnSubmit
var tempUsers = Enumerable.Range(0, 2)
.Select(i => new User{
ID = null,
EMail = i + "@" + i + ".de",
Password = "Test1234",
JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
});
users.InsertAllOnSubmit(tempUsers);
context.SubmitChanges();解决方案3
在每个循环中处理和重新创建上下文(似乎是个很糟糕的主意)
for (int i = 0; i < 2; i++) {
using (var context = new DataContext(Connection)) {
var users = context.GetTable<User>();
User tempUser = new User() {
ID = null,
EMail = i + "@" + i + ".de",
Password = "Test1234",
JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
};
users.InsertOnSubmit(tempUser);
context.SubmitChanges();
}
}发布于 2016-05-11 11:50:11
您只需删除ID = null,因为这是自动增量,不需要写这个。Alter "User“删除自动增量列ID中的NULL检查,并在类"User”中删除。ID列是自动增量,然后不需要使用NULL约束进行检查。
for (int i = 0; i < 2; i++) {
User tempUser = new User() {
EMail = i + "@" + i + ".de",
Password = "Test1234",
JoinedDate = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
};https://stackoverflow.com/questions/37159299
复制相似问题