当我尝试保存实体并在EF Core
中返回其ID时,我注意到了一个奇怪的事情我在考虑调用saveChanges()之前是否考虑过它,但它适用于具有类似设置的另一个实体。
ps:我使用工作单元来保存最后的所有更改。
是什么原因?
答案 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”开始递增,但是,在尝试保存时,需要付出更多的努力来防止键冲突。