【问题标题】:How to get EFCore In-memory db to auto-increment non-key fields如何让 EFCore 内存数据库自动增加非关键字段
【发布时间】:2019-07-17 14:57:21
【问题描述】:

我们有一个实体键在一个 guid 上,它带有另一个基于自动递增 int 属性的人类可读键。这在运行应用程序时按预期工作。

出于测试目的,我们使用的是 EF 内存数据库,但这似乎只会在它也是键的情况下自动增加一列。

使用属性注解属性或 fluent API 均无效。

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int OrderNumber { get; private set; }

    ===========

    modelBuilder.Entity<Order>(order =>
    {
        order.Property(p => p.OrderNumber).ValueGeneratedOnAdd();
    });

在这两种情况下,OrderNumber 在插入后都保留为 0。有没有办法让内存数据库做到这一点,或者这是一个已知的限制? (谷歌搜索发现了围绕关键值重新播种的问题,但没有发现这个特定问题)

【问题讨论】:

    标签: .net in-memory-database ef-core-2.2


    【解决方案1】:

    非键属性的值生成不同(不知道为什么) - 当属性没有明确分配值生成器时不会触发。对于生成临时密钥的提供程序,它可以工作,因为实际值是在SaveChanges 之后分配的。但是内存中的提供程序值生成器会生成持久键,并且由于不会为非键属性调用它们,ValueGeneratedOnAdd 没有效果(不起作用)。

    解决方法是为此类属性显式分配值生成器。您需要以下命名空间:

    using Microsoft.EntityFrameworkCore.InMemory.ValueGeneration.Internal;
    

    然后是类似这样的代码:

    modelBuilder.Entity<Order>(order =>
    {
        var orderNumber = order.Property(p => p.OrderNumber);
        orderNumber.ValueGeneratedOnAdd();
        // only for in-memory
        if (Database.IsInMemory())
            orderNumber.HasValueGenerator<InMemoryIntegerValueGenerator<int>>();
    });
    

    【讨论】:

      【解决方案2】:

      您也可以编写自己的 ValueGenerator。

      public class OrderIdValueGenerator : ValueGenerator<int>
      {
          private int _current;
      
          public override bool GeneratesTemporaryValues => false;
      
          public override int Next(EntityEntry entry)
              => Interlocked.Increment(ref _current);
      }
      

      然后像这样使用它:

      modelBuilder.Entity<Order>(order =>
      {
          order.Property(p => p.OrderNumber).HasValueGenerator<OrderIdValueGenerator>();
      });
      

      您不必指定.ValueGeneratedOnAdd()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 2011-03-14
        • 2011-10-22
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 2016-06-04
        相关资源
        最近更新 更多