我有以下陈述:
int newId = db.OnlinePayments.Max(op => op.InvoiceNumber) + 1;
opi.InvoiceNumber = newId;
await db.SaveChangesAsync();
InvoiceNumber
列应该是唯一的,但这种方法很危险,因为在我获取newId
值的同时,另一条记录可能会被添加到表中。我读到锁定表可以解决这个问题,但我不确定如何使用Entity Framework实现。
此外,我认为在事务中执行此操作就足够了,但有人说这不够。
更新
假设这是Entity Framework中的表定义。
public class OnlinePaymentInfo
{
public OnlinePaymentInfo()
{
Orders = new List<Order>();
}
[Key]
public int Id { get; set; }
public int InvoiceNumber { get; set; }
public int Test { get; set; }
//..rest of the table
}
显然,Id
是该表的主键。我可以通过以下方式将 InvoiceNumber
标记为自增:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int InvoiceNumber { get; set; }
现在,如果我像这样做,它就会起作用:
现在,如果我像这样做,它就会起作用:
var op = new OnlinePayment { Test = 1234 };
db.OnlinePayments.Add(op);
await db.SaveChangesAsync();
它将自动生成一个唯一的数字作为InvoiceNumber
。但是当我更改记录时,我需要这个数字也随之更改。例如:
var op = await db.OnlinePayments.FindAsync(2);
op.Test = 234243;
//Do something to invalidate/change InvoideNumber here
db.SaveChangesAsync();
我试图将其设置为0
,但当我尝试为其分配一个值时,出现了错误,指示我无法为标识列分配值。这就是我试图手动完成的原因。
opi.Invoicenumber
)都可以使用它来引用它。 - FlaterGuid
吗?此外,如果您解释了为什么每次发票更改时都必须更改InvoiceNumber,那可能会有所帮助-不明白为什么发票号码会更改(实际上,在许多情况下,出于审计原因,一旦发票已经发布并且第三方正在使用该InvoiceNumber作为参考,就不允许这样做)。您是否将InvoiceNumber用作某种版本号或其他内容? - Stephen Byrne