Entity framework EF Core Add函数返回负id
今天,当我试图保存一个实体并在EF Core中返回其id时,我注意到一件奇怪的事情 之前: 之后: 在调用saveChanges()之前,我一直在考虑它是否可以与另一个具有类似设置的实体一起工作 ps:我使用工作单元在最后保存所有更改Entity framework EF Core Add函数返回负id,entity-framework,asp.net-core-1.0,Entity Framework,Asp.net Core 1.0,今天,当我试图保存一个实体并在EF Core中返回其id时,我注意到一件奇怪的事情 之前: 之后: 在调用saveChanges()之前,我一直在考虑它是否可以与另一个具有类似设置的实体一起工作 ps:我使用工作单元在最后保存所有更改 原因是什么?在保存更改之前,它将是负数。只需在上下文中调用Save _dbContext.Locations.Add(location); _dbContext.Save(); 保存后,您将拥有数据库中的ID。您可以使用事务,在获得ID后出现问题时可以回滚事务
原因是什么?在保存更改之前,它将是负数。只需在上下文中调用
Save
_dbContext.Locations.Add(location);
_dbContext.Save();
保存后,您将拥有数据库中的ID。您可以使用事务,在获得ID后出现问题时可以回滚事务
另一种方法是不使用数据库的内置标识字段,而是自己实现它们。当您有很多批量插入操作时,这可能非常有用,但它有一个价格-不容易实现。显然,这不是一个bug,而是一个功能: 这样覆盖这种行为并不太困难:
public class IntValueGenerator : TemporaryNumberValueGenerator<int>
{
private int _current = 0;
public override int Next(EntityEntry entry)
{
return Interlocked.Increment(ref _current);
}
}
公共类IntValueGenerator:TemporaryNumberValueGenerator
{
专用int_电流=0;
公共覆盖int Next(EntityEntry)
{
返回联锁增量(参考电流);
}
}
然后在此处引用自定义值生成器:
public class CustomContext: DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var type in modelBuilder.Model.GetEntityTypes().Select(c => c.ClrType))
{
modelBuilder.Entity(type, b =>
{
b.Property("Id").HasValueGenerator<IntValueGenerator>();
});
}
base.OnModelCreating(modelBuilder);
}
}
public类CustomContext:DbContext
{
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
foreach(modelBuilder.Model.GetEntityTypes()中的变量类型。选择(c=>c.ClrType))
{
实体(类型,b=>
{
b、 属性(“Id”).HasValueGenerator();
});
}
基于模型创建(modelBuilder);
}
}
这将导致临时Id从“1”增加,但是,在尝试保存时,需要更多的努力来防止密钥冲突。请不要使用代码截图,复制粘贴问题中的相关代码并应用代码格式。在EF Core 3.1中,此行为已更改,添加实体的Id(再次)为0。现在发现此问题,这很搞笑,因为这使得TPH不可能与主外键一对一地使用,因为最终会得到多个0的主键。即使按导航属性分配也会导致此失败。