【问题标题】:EF Core Add function returns negative idEF Core Add 函数返回负 id
【发布时间】:2017-01-19 02:07:38
【问题描述】:

我今天在 EF Core 中尝试保存实体并返回其 id 时发现了一件奇怪的事情

之前: 后:

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

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

原因是什么?

【问题讨论】:

  • 请不要对代码使用屏幕截图,将相关代码复制粘贴到您的问题中并应用代码格式。

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


【解决方案1】:

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

像这样覆盖这种行为并不难:

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

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

然后在这里引用自定义值生成器:

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);
    }
}

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

【讨论】:

    【解决方案2】:

    在您保存更改之前,这将是负数。只需在上下文中调用Save

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

    保存后,您将拥有数据库中的 ID。可以使用事务,获取ID后出现问题可以回滚。

    另一种方法是不使用数据库的内置 IDENTITY 字段,而是自己实现它们。当您有大量的批量插入操作时,这可能非常有用,但它是有代价的——实施起来并不容易。

    【讨论】:

    • 此行为在 EF Core 3.1 中发生了变化,添加的实体的 id (再次)为 0。
    • 现在发现这个,很有趣,因为它使得TPH无法与主外键一对一地使用,因为你最终会得到多个主键为0。即使通过导航分配属性导致此失败。
    猜你喜欢
    • 2017-11-14
    • 2018-04-18
    • 2016-10-10
    • 2017-01-18
    • 2021-01-31
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多