加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 在Entity Framework中的2个语句中锁定表

发布时间:2020-12-16 07:29:32 所属栏目:asp.Net 来源:网络整理
导读:我有以下声明: int newId = db.OnlinePayments.Max(op = op.InvoiceNumber) + 1;opi.InvoiceNumber = newId;await db.SaveChangesAsync(); InvoiceNumber列应该是唯一的,但这种方法很危险,因为从我获得newId的值时,可以将另一条记录添加到表中.我读到锁定表
我有以下声明:

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标记为Idenity:

[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,但是当我尝试为其分配值时,我收到一个错误,指示我无法分配给Identity列.这就是我尝试手动执行此操作的原因.

解决方法

你可以做的一个选择是创建关系

public class OnlinePaymentInfo
{
    public OnlinePaymentInfo()
    {
        Orders = new List<Order>();
    }

    [Key]
    public int Id { get; set; }

    [Key,ForeignKey("InvoiceNumber")]
    public InvoiceNumber InvoiceNumber { get; set; }

    public int Test { get; set; }
    //..rest of the table
}

public class InvoiceNumber
{
    public InvoiceNumber()
    {
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
}

当你保存OnlinePaymentInfo时,你会这样做

paymentInfo.InvoiceNumber = new InvoiceNumber();

然后,EF将为InvoiceNumber创建一个新的标识,这将是唯一的.

PS.首先不完全确定代码的语法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读