Linq2db插入标识不能按预期工作

时间:2018-02-14 15:17:48

标签: c# .net wpf postgresql linq2db

为了继续使用数据库中的数据,我使用linq2db。

如果该对象有一个对象,则在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 ...

3 个答案:

答案 0 :(得分:1)

我怀疑您的ID列已通过IdentityAttribute属性或ColumnAttribute.IsIdentity = true标记为身份

它告诉linq2db在使用插入方法插入记录时使用自动生成的值,而没有显式字段设置程序(例如Insert(object)方法或MergeAPI的InsertWhenNotMatched([predicate])操作)。

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

答案 1 :(得分:0)

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

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

这是在数据库中插入前面设置了id的实例。

对于那些遇到同样问题的人来说,祝你好运:)

答案 2 :(得分:-1)

请尝试使用此代码:

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