【问题标题】:Linq-To-SQL Problem Inserting Multiple Objects That Are The Same插入多个相同对象的 Linq-To-SQL 问题
【发布时间】:2010-06-24 12:20:00
【问题描述】:

这是我的对象关联:

Summary
-> Job
  -> Operator
-> Job
  -> Operator

所以,我有一个 Summary 对象,其中包含一个 Jobs 集合,它有一个 Operator 对象(时钟 #、名称等)

创建新摘要时,我会检查并创建现有的新作业并添加所有属性。然后,在已构建的 Summary 对象上执行一次插入。然后,如果需要,这会插入新的作业和运算符,否则我可能会从数据库中读取现有的作业和运算符。

当我有相同的操作员同时运行两个作业并且数据库中不存在该操作员时,问题就出现了。 Linq-To-SQL 尝试插入同一个对象两次,但由于我使用时钟 # 作为主键而失败。

我可以为主键创建一个自动编号,但是我会得到重复的数据,我宁愿不这样做。有没有人有任何想法来解决这个问题?

谢谢!

【问题讨论】:

  • 新问题...当我尝试在创建摘要的子对象期间(通过循环)插入运算符时,Linq 尝试提交所有更改(包括部分构建的摘要)。有一些未填充的日期字段导致插入崩溃。另外,我使用 StructureMap 来缓存数据库,因此不同的存储库应该使用相同的实例。

标签: linq-to-sql insert


【解决方案1】:

我认为问题在于您如何编写对象创建。我还没有看到你的代码,但我认为你正在做这样的事情:

Summary summary = new Summary
                                  {
                                      Jobs = new List<Job>
                                                 {
                                                     new Job
                                                         {
                                                             Operator = new Operator {Name = "foo"}
                                                         },
                                                     new Job
                                                         {
                                                             Operator = new Operator {Name = "foo"}
                                                         }
                                                 }
                                  };

如果是这种情况,请尝试预先实例化运算符“foo”,然后将其分配给两个作业。

如果你已经这样做了,但仍然出现错误,那么你应该先创建运算符并将其保存到数据库中,然后检索它并将其分配给所需的作业。

【讨论】:

  • 是的,和那个差不多。唯一的区别是您在哪里创建新的 Operator,我会先检查 db,如果存在则从那里提取。我曾想过您的解决方案,但我担心它会花费大量时间来重写我们已经构建的内容。希望有一个简单的属性我可以打开,Linq 会检查这种事情......
  • 最终不得不在添加新运算符时检查是否有多个作业...如果是,并且运算符相同,则将运算符对象设置在第二个中作业到第一个作业中的操作员对象的值(而不是为第二个作业创建一个新的操作员)。似乎有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2011-03-10
  • 1970-01-01
  • 2011-10-22
  • 2022-01-08
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多