【问题标题】:In Entity Framework id value doesn't get incremented by 1, but by 1000? [duplicate]在实体框架中,id 值不会增加 1,而是增加 1000? [复制]
【发布时间】:2019-07-31 03:41:25
【问题描述】:

在下表中,您可以看到billid 列在第 10 行增加了 1000。

生成新bill的代码如下:

private void NewBill()
{
    var bill = new Bill
        {
            BillDate = DateTime.Now,
            InUse = true,
            Paid = false,
            TableId = _tableId,
            UserId = frmLogIn.LoggedInUserId
        };

    using (var context = new Context())
    {
        context.Bills.Add(bill);
        context.SaveChanges();
    }
}

为什么它不只增加 1 ?

我正在使用带有 SQL Server 2017 Express 版本的 EF6。

【问题讨论】:

  • 你为什么在乎?跟EF没关系。执行此操作的是数据库服务器,您无法控制它。
  • 你看过你的表定义了吗??
  • 这与 EF 没有任何关系 - 这是 SQL Server 中的一个功能 - read more about here on dba.stackexchange.com

标签: c# entity-framework-6


【解决方案1】:

这可能是由于@CodingYoshi 指出的here 所解释的各种原因。为避免此类事故,您可以选择生成 BillId,通过获取最后一个 BillId 并将其递增 1,您几乎可以确定它是连续的。

你可以编写如下函数

public int NextId()
{
    int lastId = 0;

    var billsFromStore = _context.Bills;

    if (billsFromStore.Any())
    {
        var idsFromStore = _context.Bills.Select(x => x.BillId);

        lastId = idsFromStore.Max();
    }

    return ++lastId;
}

您可能希望使用lock statement 来防止不同的线程增加值

【讨论】:

  • 然后在代码在生产中运行后立即获得各种竞争条件。
  • 你为什么要这样做,以获得什么?还想象一下这种情况会发生,它会:一个线程获得下一个 id 21,并释放锁,但在将记录插入表之前还有更多工作要做。现在另一个线程要求 id,它也会得到 21。Boom!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多