从表中读取,使用实体框架5和mvc 4推断计数器并在数据库上插入

时间:2014-02-06 17:10:07

标签: asp.net-mvc-4 concurrency entity-framework-5

我有这种情况。我有一个名为Request的表。该表有一个名为Number的列。每次我想插入一个新的请求,然后我获取最后一个请求,并根据其请求号我推断一个新请求。 例如,我在我的数据库Request1上有编号0001,然后当我插入一个新的我获取Request1并根据其编号我推断我的新请求编号应该是0002。

当我想同时创建两个请求时,会出现问题。进程一获取Request1,进程二获取Request1。当进程一推断出新的请求号(应该是0001)时,进程二执行相同的操作。最后,我将创建两个具有相同编号的新请求。

有人知道如何解决这个问题吗?

抱歉我的英文! ;)

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决您的问题。

  • 该字段始终是数字,顺序,每条记录的值必须高于最后一条记录?

如果是,您只需让数据库为您完成工作。只需将有问题的字段设置为表的主键和身份。在这种情况下,数据库将为内部竞争提供解决方案,当然也可以防止最终获得重复记录。这个数字由DBMS(SQL Server,MySQL,Oracle ......)自动填充

如果您正在使用EntityFramework和Code First,只需进入实体的声明(定义数据库中的表的C#类)并找到您需要的字段并为其添加2个属性:

// Probably you have this kind of code (which fieldID should be the field name) 
 public Int32 fieldID {get; set;} 

// Just add these two attributes before the declaration of the field 
[Key] 
[DatabaseGenerated (DatabaseGeneratedOption.Identity)] 
public Int32 fieldID {get; set;} 

/* Example in C#, assuming you are using SQL Server and EFCF */
/* EF CF means Entity Framework Code First! */ 
  • 您需要实现一个逻辑来填充此字段,该字段可能不是如上所述,或者该字段不是数字或数据库无法完成,必须由您的应用程序直接执行?

您可以在无法竞争的简单代码上实现lock

在进行数据操作的类中,遇到问题时,声明一个Object类型的变量,静态和只读,如下所示:

private static readonly Object concurrencyLock = new Object ();

在实现需要访问的逻辑的方法中,使用锁定策略

唯一地封闭代码
lock(concurrencyLock) { 
    //Do stuff here without concurrency 
    /* When the current request into this part of the code, 
any other request will execute until the line above with "lock" statement. 
Until this current request exit this "lock" block of code, 
the other(s) will wait. As this one leave this block, one other join...
One at a time as you wish. */
}

还有其他方法可以做到这一点,但是在Web应用程序(如Mutex,如果它是Windows服务,Windows)中工作得更好表格申请)