2010-03-09 56 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