无法添加已存在的实体。 (LINQ to SQL)

时间:2010-03-09 07:34:18

标签: vb.net linq-to-sql

在我的数据库中有3个表

CustomerType
CusID

的EventType
EventTypeID

CustomerEventType
CusID
EventTypeID

alt text http://img706.imageshack.us/img706/8806/inserevent.jpg


Dim db = new CustomerEventDataContext
Dim newEvent = new EventType
newEvent.EventTypeID = txtEventID.text
db.EventType.InsertOnSubmit(newEvent)
db.SubmitChanges()

'To select the last ID of event'
Dim lastEventID = (from e in db.EventType Select e.EventTypeID Order By EventTypeID Descending).first()

Dim chkbx As CheckBoxList = CType(form1.FindControl("CheckBoxList1"), CheckBoxList)
Dim newCustomerEventType = New CustomerEventType
Dim i As Integer
For i = 0 To chkbx.Items.Count - 1 Step i + 1
    If (chkbx.Items(i).Selected) Then
        newCustomerEventType.INTEVENTTYPEID = lastEventID
        newCustomerEventType.INTSTUDENTTYPEID = chkbxStudentType.Items(i).Value
        db.CustomerEventType.InsertOnSubmit(newCustomerEventType)
        db.SubmitChanges()
    End If
Next


当我从CheckBoxList1只检查1个CustomerEventType的ID时,它工作正常。它将数据插入到带有ID 1和CustomerEventType ID 1的EventType中。但是,当我检查它们时,错误信息表示

无法添加已存在的实体

有什么建议吗? Thx提前。

1 个答案:

答案 0 :(得分:2)

在再次按下按钮之前,您是否更改了EventID?对我而言,你看起来并没有。这将导致代码尝试将带有ID 1的事件插入到数据库中,尽管它已经存在。

也许尝试自动增加事件ID或在尝试插入事件之前检查事件是否存在。

修改:

好的,这就是我认为你想要做的...如果我理解正确(它在C#中,因为我对这种语言更流利 - 但你应该能够轻松地将算法转换为VB - 所以只是把它作为伪代码):

var db = new CustomerEventDataContext();
var newEvent = db.EventTypeSingleOrDefault(x => x.EventTypeId == txtEventID.Text);
if (newEvent != null) {
    newEvent = new EventType();
    newEvent.EventTypeId = txtEventID.Text;
    db.EventType.InsertOnSubmit();
}

var chkbx = (CheckBoxList) form1.FindControl("CheckBoxList1");
for (int i = 0; i < chkbx.Items.Count; i++) {
    var value = chkbxStudentType.Items(i).Value;
    if (db.CustomerEventTypes.SingleOrDefault(x => x.EventTypeId == newEvent.EventTypeId) != null) {
        // item already exists
    } else {
      var newCustomerEventType = new CustomerEventType();
      newCustomerEventType.INTEVENTTYPEID = newEvent.EventTypeId;
    newCustomerEventType.INTSTUDENTTYPEID = value;
    db.CustomerEventType.InsertOnSubmit(newCustomerEventType);
    }
}

db.SubmitChanges();

我发现了两件事:

  1. 您正在添加新的EventType,然后根据ID选择最后一个事件类型。这可能不会导致您刚刚添加的项目。
  2. 您不必在每个SubmitChanges后致电InsertOnSubmitDataBaseContext实现为您保存插入的对象,您可以引用它们。然后,您执行单个提交以提交所有更改。但请注意,在某些复杂的情况下,需要单独的SubmitChanges,但这种情况很少发生。