2014-01-23 77 views
0

我有我的模型在dbml文件中定義。我有一個Car實體,我想通過Form插入數據。表格使用這段代碼: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事件探查器:

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

VALUES(@ P0,@ P1,@ P2,@ P3,@ P4,@ P5,@ P6)

SELECT CONVERT(智力,SCOPE_IDENTITY ())AS [value]',N'@ p0 varchar(8000),@ p1 varchar(8000),@ p2 varchar(8000),@ p3 decimal(18,2),@ p4 int,@ p5 varchar ),@ p6 varchar(8000)',@ p0 ='b',@ p1 ='B',@ p2 ='可用',@ 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上下文對象的更改範圍有關的內容? – David

+0

前兩個插入(通過表單)被髮送到SQL Server沒有DELETE語句。實體的第三條記錄添加了一個INSERT和兩個DELETE。 –

+0

你可以顯示你的代碼而不是僅僅描述它嗎? – David

回答

2

你在哪裏定義/初始化Context?它本地代碼,否則你冒着併發問題的風險(這可能是你所看到的行爲的原因)。由於這是一個單擊事件處理程序,因此可以合理地假設當用戶在界面中執行/調用某種操作時調用此功能。這種方法通常應該是:

  1. 用戶調用操作。
  2. 處理完成/提交操作。
  3. UI響應用戶。

(多線程一邊,當然。但是,這是其他併發問題一大堆,你可能不希望/需要在這一點上處理。)

但是,你有這樣的該範圍之外存在模糊的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(); 
} 

這將創建數據庫上下文,使用它,一旦它完成處置。因此,在這種情況下,每個「插入」都是它自己的孤立事件,不受其他事件的影響。