2010-03-09 90 views
0

在我的数据库有3个表

CustomerType
CusID

事件类型
EventTypeID

CustomerEventType
CusID
EventTypeID

alt text http://img706.imageshack.us/img706/8806/inserevent.jpg无法添加已存在的实体。 (LINQ到SQL)


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检查CustomerEventType只有1单ID,它工作正常。它将数据插入ID为1和CustomerEventType ID为1的EventType。但是,当我检查它们时,错误消息说

无法添加已存在的实体

有什么建议吗? Thx提前。

回答

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. 您不必在每个InsertOnSubmit之后拨打SubmitChanges。你可以引用它们来实现插入的对象。然后你做一个提交来提交所有的改变。但是,请注意,在某些复杂情况下,需要单独购买SubmitChanges,但这种情况很少。
+0

Thx回复Obalix!我想要的结果是 我想将新的EventTypeID 1插入到EventType表中,并在一个FORM中包含2个ID的CustomerType复选框列表。 所以,我点击插入按钮后,事件类型表和CustomerEventType表中的数据应该是: 事件类型 EventTypeID CustomerEventType EventTypeID = 1,1 CusID = 1,2 – Vicheanak 2010-03-09 08:30:21

+0

HTTP://social.msdn .microsoft.com /论坛/ zh-CN/linqtosql /线程/ 242a3235-1d62-4c5d-822a-575be7f5f141 您可以检查此帖以获取清晰的说明。谢谢。 – Vicheanak 2010-03-09 08:47:26

+0

该按钮仅会被点击一次。我只是试图使数据库和代码易于阅读,实际上是EventType表,EventTypeID和EventName是EventTypeID是主键自动递增1以便它始终是唯一的。 EventTypeID文本框实际上假设为EventName文本框。 CustomerType CheckboxList与来自CustomerTypes 1和2的2个ID绑定。 – Vicheanak 2010-03-09 08:54:29

相关问题