簡體   English   中英

使用InsertOnSubmit在C#問題中使用LINQ to SQL

[英]LINQ to SQL in C# issue with InsertOnSubmit

我在dbml文件中定義了我的模型。 我有一個Car實體,我想通過Form插入數據。 表單使用此代碼塊:

 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])

價值觀(@ p0,@ p1,@ p2,@ p3,@ p4,@ p5,@ p6)

SELECT CONVERT(Int,SCOPE_IDENTITY())AS [value]',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 ='可用',@ 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'

為什么只插入前兩個記錄而第三個記錄刪除所有以前的記錄? 我錯過了什么嗎?

謝謝!

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

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

(當然,除了多線程之外。但是,這可能是您可能不需要/需要處理的其他並發問題。)

但是,您有這個模糊的Context變量,它存在於此范圍之外。 還有哪些其他范圍正在對此變量進行操作? 你沒有封裝你應該做的工作單元。

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();
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM