LINQ to SQL in C#问题与InsertOnSubmit

吉里·胡巴切克(Jiri Hubacek)

我在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十进制(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变量的范围缩小为仅在该请求中执行的操作。像这样的东西:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

LINQ to SQL:InsertOnSubmit()与Add()

来自分类Dev

从 SQL 到 C# LINQ

来自分类Dev

SQL到LINQ的转换问题

来自分类Dev

LINQ to SQL中包含的问题

来自分类Dev

Sql To Linq遇到问题

来自分类Dev

LINQ To SQL C#更新类

来自分类Dev

C# linq-to-sql。与订单连接

来自分类Dev

C# Linq-to-SQL 多列

来自分类Dev

复杂的SQL Server查询到LINQ to SQL查询C#

来自分类Dev

查询Linq到Sql Entity Framework C#

来自分类Dev

对LINQ C#的SQL查询[联接多个表]

来自分类Dev

区分将SQL查询转换为Linq(c#)

来自分类Dev

将SQL查询转换为LINQ Lambda C#

来自分类Dev

C#使用Linq到Sql获取数据

来自分类Dev

SQL Server,LINQ,C#存储数据链信息

来自分类Dev

查询Linq到Sql Entity Framework C#

来自分类Dev

对LINQ C#的SQL查询[联接多个表]

来自分类Dev

C# Linq to Sql 如何转换日期时间?

来自分类Dev

在 C# Linq 中使用 T-SQL DATEFROMPARTS()

来自分类Dev

c#避免LINQ to SQL数据库自动处理

来自分类Dev

C# Linq Where on SQL 用户定义函数

来自分类Dev

如何在LINQ-To-SQL中排除Contex.InsertOnSubmit()上的用户定义字段?

来自分类Dev

基于Linq To Sql表类结构的C#Linq CopyToDataTable

来自分类Dev

C#中的Linq Join问题

来自分类Dev

C# 实体框架 Linq Where 问题

来自分类Dev

某些linq2sql生成的T-SQL的问题

来自分类Dev

某些linq2sql生成的T-SQL的问题

来自分类Dev

优化LINQ查询调用Newbie C#/ LINQ问题

来自分类Dev

Linq to SQL的C#XML文档