Невозможно добавить объект, который уже существует. (LINQ to SQL) - PullRequest
0 голосов
/ 09 марта 2010

в моей базе 3 таблицы

CustomerType
CusID

EventType
EventTypeID

CustomerEventType
CusID
EventTypeID

альтернативный текст 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


Это прекрасно работает, когда я проверил только 1 одиночный идентификатор CustomerEventType из CheckBoxList1. Он вставляет данные в EventType с идентификатором 1 и идентификатором CustomerEventType 1. Однако, когда я проверил оба из них, появляется сообщение об ошибке

Невозможно добавить сущность, которая уже существует .

Любые предложения, пожалуйста? Спасибо заранее.

1 Ответ

2 голосов
/ 09 марта 2010

Вы изменили EventID до повторного нажатия кнопки. Для меня это выглядит как вы не сделали. Это приведет к тому, что код попытается вставить событие с ID 1 в базу данных, хотя оно уже там.

Возможно, попробуйте увеличить идентификатор события автоматически или проверьте, присутствует ли событие уже перед попыткой его вставить.

Редактировать:

Хорошо, вот что, я думаю, вы хотите сделать ... если я правильно понял (это на 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 и затем выбирали последний тип события на основе идентификатора. Это может не привести к тому, что вы только что добавили элемент.
  2. Вам не нужно звонить SubmitChanges после каждого InsertOnSubmit. Реализация DataBaseContext содержит вставленные объекты для вас, и вы можете ссылаться на них. Затем вы делаете одну отправку, чтобы зафиксировать все изменения. Обратите внимание, однако, что в некоторых сложных обстоятельствах требуется отдельный SubmitChanges, но это редко бывает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...