【问题标题】:Linq2db insertion with identity not working as expected带有身份的 Linq2db 插入未按预期工作
【发布时间】:2018-07-25 05:20:34
【问题描述】:

为了继续使用来自数据库的数据在应用程序中工作,我使用的是 linq2db。

如果对象有 ID,则在 DB 中插入对象应插入 WITH ID,​​如果没有身份,则在 DB 中为该对象创建新 ID。
但就目前而言,这种方法在两种情况下都插入了新的 id。

我可以举个例子:

using(var db = new EIDB())
{
  Customer.Id=20;
  Customer.Name="Greg";
  db.Insert(Customer);
}

在此插入之后,我们在 DB 中有这个名为“Greg”且 ID=1 的客户...

***有没有办法做类似的事情,但插入之前设置的相同 ID(在我们的示例中 = 20)?

PS:如果我使用 NpgsqlCommand 并插入相同的数据,则插入 ID=20...

【问题讨论】:

    标签: c# .net wpf postgresql linq2db


    【解决方案1】:

    我找到了解决方案。如果我只使用 db.Insert(Customer) 正在使用新 ID 在数据库中创建一个新实例。但是,如果我这样做:

    db.Customers
      .Value(p => p.Name, Customer.Name)
      .Value(p => p.Id, Customer.Id)
      .Insert();
    

    这是在数据库中插入具有之前设置的 id 的实例。

    祝遇到同样问题的人好运:)

    【讨论】:

      【解决方案2】:

      我怀疑您的 Id 列被IdentityAttribute 属性或ColumnAttribute.IsIdentity = true 标记为身份

      它告诉 linq2db 在使用插入方法插入记录时使用自动生成的值,而无需像 Insert(object) 方法或 MergeAPI 的 InsertWhenNotMatched([predicate]) 操作这样的显式字段设置器。

      此逻辑不适用于具有显式字段设置器(如 Insert(() => new Record(){Id = explicitValue}).Value(() => Id, value).Insert()InsertWhenNotMatched(target => new Record(){Id = explicitValue}[, predicate]))的操作。在这些情况下,因为您明确告诉 linq2db 将哪个值插入标识字段 - 它将使用您提供的值。

      【讨论】:

        【解决方案3】:

        请尝试使用此代码:

        using (dbFoodBlogEntities db = new dbFoodBlogEntities())
        {
            db.tblBloggers.AddObject(objtblBlogger);
            db.SaveChanges();
        }
        

        【讨论】:

        • 我也会尝试这样做。谢谢!
        • 您使用的是不同版本的 linq2db 吗?没有这样的方法 AddObject 和/或 SaveChanges...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        • 2016-01-08
        相关资源
        最近更新 更多