使用InsertOnSubmit在C#问题中使用LINQ to SQL

时间:2014-01-23 15:50:26

标签: c# linq-to-sql

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

VALUES(@ 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'

为什么刚刚插入前两个记录而第三个记录先删除了所有记录?我错过了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您在哪里定义/初始化Context应该是该代码的本地代码,否则您将面临并发问题的风险(这可能是您所看到的行为的原因)。由于这是一个单击事件处理程序,因此可以合理地假设当用户在接口中执行/调用某种操作时调用此功能。这种方法通常应该是:

  1. 用户调用操作。
  2. 处理并完成/提交行动。
  3. UI响应用户。
  4. (当然,除了多线程之外。但这是你可能不需要/需要处理的其他一系列并发问题。)

    但是,这个模糊的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();
    }
    

    这将创建数据库上下文,使用它,并在完成后处理它。因此,在这种情况下,每个“插入”都是它自己的孤立事件,不受其他事件的影响。