Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF Core Add函数返回负id_Entity Framework_Asp.net Core 1.0 - Fatal编程技术网

Entity framework EF Core Add函数返回负id

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后出现问题时可以回滚事务

今天,当我试图保存一个实体并在EF Core中返回其id时,我注意到一件奇怪的事情

之前: 之后:

在调用saveChanges()之前,我一直在考虑它是否可以与另一个具有类似设置的实体一起工作

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


原因是什么?

在保存更改之前,它将是负数。只需在上下文中调用
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的主键。即使按导航属性分配也会导致此失败。