2014-01-23 5 views
0

У меня есть моя модель, определенная в файле dbml. У меня есть объект Car, которому я хочу вставить данные через форму. Форма использует этот блок кода:LINQ to SQL в выпуске C# с InsertOnSubmit

private void button1_Click(object sender, EventArgs e) 
    { 
      Car CarToCreate = new Car(); 
      CarToCreate.Name = newCarNameTextBox.Text; 
      CarToCreate.CarClass = newCarClassComboBox.SelectedItem.ToString(); 
      CarToCreate.PricePerDay = Convert.ToDecimal(newCarPriceTextBox.Text); 
      CarToCreate.Capacity = Convert.ToInt32(newCarCapacityTextBox.Text); 
      CarToCreate.RegistrationNumber = newCarRegNumberTextBox.Text; 
      CarToCreate.Description = newCarDescriptionTextBox.Text; 
      CarToCreate.CarState = "Available"; 

      Context.Cars.InsertOnSubmit(CarToCreate); 
      Context.SubmitChanges(); 

      CarModifiedEvent(); 
      this.Close(); 
    } 

Первые две записи вставлены успешно. Когда я пытаюсь вставить третью строку два предыдущих, удаляются (строка Context.Cars.InsertOnSubmit). Я был в состоянии отслеживать запросы в SQL Profiler:

exec sp_executesql N'INSERT INTO [dbo].[Car]([Name], [CarClass], [CarState], [PricePerDay], [Capacity], [RegistrationNumber], [Description]) 

VALUES (@ p0, @ p1, @ p2, @ p3, @ p4, @ p5, @ p6)

конвертируйте (Int, SCOPE_IDENTITY()) AS [значение] ', N' @ p0 varchar (8000), @ p1 varchar (8000), @ p2 varchar (8000), @ p3 decimal (18,2), @ p4 int, @ p5 varchar (8000), @ p6 varchar (8000) ', @ p0 =' b ', @ p1 =' B ', @ p2 =' Available ', @ p3 = 2.00, @ p4 = 2, @ p5 =' 2 ', @ p6 = '2'

exec sp_executesql N'DELETE FROM [dbo].[Car] WHERE ([CarID] = @p0) AND ([Name] = @p1) AND ([CarClass] = @p2) AND ([CarState] = @p3) AND ([PricePerDay] = @p4) AND ([Capacity] = @p5) AND ([RegistrationNumber] = @p6) AND ([Description] = @p7)',N'@p0 int,@p1 varchar(8000),@p2 varchar(8000),@p3 varchar(8000),@p4 decimal(18,2),@p5 int,@p6 varchar(8000),@p7 varchar(8000)',@p0=35,@p1='a',@p2='A',@p3='Available',@p4=1.00,@p5=1,@p6='1',@p7='1' 

Почему первые две записи только что вставлены, а третья запись удаляет все предыдущие? Я что-то упускаю?

Спасибо!

+0

Я вижу только одну вставку, выполняемую в коде. Где другие два? Как они выполняются в отношении используемых объектов и объема изменений в объекте DB Context? – David

+0

Первые две вставки (через форму) отправляются на SQL Server без операторов DELETE. Третье дополнение записи к объекту отправляет один INSERT и два DELETE. –

+0

Можете ли вы показать свой код, а не просто его описать? – David

ответ

2

Где вы определяете/инициализируете Context? Это должно быть быть локальным для этого кода, в противном случае вы рискуете столкнуться с проблемами параллелизма (что может быть причиной поведения, которое вы видите). Поскольку это обработчик события щелчка, разумно предположить, что эта функция вызывается, когда пользователь выполняет/вызывает какое-то действие в интерфейсе. Подход к этому обычно должен быть:

  1. Пользователь вызывает действие.
  2. Действие обработано и выполнено/выполнено.
  3. Пользовательский интерфейс отвечает пользователю.

(Многопоточность в сторону, конечно. Но это целый ряд других проблем параллелизма, которые вы, вероятно, не хотите/должны иметь дело с в этой точке.)

Однако, у вас есть это nebulous Context переменная, которая существует за пределами этой области. Какие другие области работают над этой переменной? Вы не инкапсулируете свою единицу работы, которую вы должны делать.

Уменьшите область действия вашей переменной Context только действием, выполняемым в этом запросе. Что-то вроде этого:

private void button1_Click(object sender, EventArgs e) 
{ 
    using(var context = new DbContext()) 
    { 
     Car CarToCreate = new Car(); 
     CarToCreate.Name = newCarNameTextBox.Text; 
     CarToCreate.CarClass = newCarClassComboBox.SelectedItem.ToString(); 
     CarToCreate.PricePerDay = Convert.ToDecimal(newCarPriceTextBox.Text); 
     CarToCreate.Capacity = Convert.ToInt32(newCarCapacityTextBox.Text); 
     CarToCreate.RegistrationNumber = newCarRegNumberTextBox.Text; 
     CarToCreate.Description = newCarDescriptionTextBox.Text; 
     CarToCreate.CarState = "Available"; 

     context.Cars.InsertOnSubmit(CarToCreate); 
     context.SubmitChanges(); 
    } 

    CarModifiedEvent(); 
    this.Close(); 
} 

Это создаст контекст БД, использовать его, и распоряжаться ею, как только это сделано. Таким образом, каждая «вставка» в этом случае является его отдельным изолированным событием, не зависящим от других событий.

Смежные вопросы