EF Core Add函数返回负id

时间:2017-01-19 02:07:38

标签: entity-framework asp.net-core-1.0

当我尝试保存实体并在EF Core

中返回其ID时,我注意到了一个奇怪的事情

在: The Id is 0 before it was added to database 后: Now the id has been changed to a negative value

我在考虑调用saveChanges()之前是否考虑过它,但它适用于具有类似设置的另一个实体。

ps:我使用工作单元来保存最后的所有更改。

是什么原因?

2 个答案:

答案 0 :(得分:17)

在您保存更改之前,它将为负数。只需在上下文中调用Save即可。

_dbContext.Locations.Add(location);
_dbContext.Save();

保存后,您将拥有数据库中的ID。您可以使用交易,在收到ID后,如果出现问题,您可以回滚。

另一种方法是不使用数据库的内置IDENTITY字段,而是自己实现它们。当您进行大量的批量插入操作时,这非常有用,但它需要付出代价 - 它并不容易实现。

答案 1 :(得分:0)

显然,这不是一个错误,它是一个功能:https://github.com/aspnet/EntityFrameworkCore/issues/6147

覆盖这种行为并不是很困难:

fields = "First Name", "Last Name", "Email Address", "Username", "Password"

    def fetch(entries):
        with open('UserData.txt', 'w') as fwu:
            for entry in entries:
                field = entry[0]
                text  = entry[1].get()
                print('{}: "{}"\n'.format(field, text))
                fwu.write('{}: "{}"\n'.format(field, text))

然后在此处引用自定义值生成器:

 public class IntValueGenerator : TemporaryNumberValueGenerator<int>
 {
     private int _current = 0;

     public override int Next(EntityEntry entry)
     {
         return Interlocked.Increment(ref _current);
     }    
 }

这将导致临时ID从“ 1”开始递增,但是,在尝试保存时,需要付出更多的努力来防止键冲突。