錯誤代碼
LJQLDataContext dc = new LJQLDataContext();
user u = new user(); // 錯誤:新建實體視為插入
u.uID = this.txtID.Text.Trim(); // 主鍵手動賦值
u.uName = this.txtName.Text.Trim();
...
dc.user.InsertOnSubmit(u); // 嘗試插入 → 主鍵衝突
dc.SubmitChanges();
正確修改流程
- 查詢現有實體:
var u = dc.user.Single(x => x.uID == id);
- 修改屬性:
u.uName = newName;(主鍵uID不可修改)。
- 提交:
dc.SubmitChanges();(無需InsertOnSubmit,實體已在上下文跟蹤中)。
修正代碼
LJQLDataContext dc = new LJQLDataContext();
string id = this.txtID.Text.Trim();
user u = dc.user.SingleOrDefault(x => x.uID == id);
if (u != null) {
u.uName = this.txtName.Text.Trim();
u.uSix = this.txtSix.Text.Trim();
u.uPassword = this.txtPassword.Text.Trim();
// u.uID 不修改
dc.SubmitChanges(); // 自動生成UPDATE SQL
load(); // 刷新界面
} else {
MessageBox.Show("用戶不存在");
}
關鍵點
new Entity() + InsertOnSubmit = **插入新記錄**。
- 查詢得到的實體自動附加到
DataContext,屬性變更自動檢測,SubmitChanges生成UPDATE。
- 主鍵屬性設置
IsPrimaryKey=true、IsDbGenerated=false(手動分配)或true(自增)。
- 并發衝突:
SubmitChanges(ConflictMode.ContinueOnConflict)配合RefreshMode.KeepCurrentValues處理。