我有同样的问题,但我解决了它在C#中。
我应该有映射表中的实体:
public class MyEntity
{
Kind IdKind{get; set;}
int Number{get;set;}
}
我应该有和辅助实体来存储每一种所使用的最后一个号码。
public class LastNumber
{
Kind IdKind{get;set;}
int LastNumber{get;set;}
}
然后添加行(myEntity所的对象),以表之前,我应该算使用带有那种LastNumberEntity的LastNumber字段的正确数量等于我的一种价值。
我们必须注意到,这个策略有一个并发问题,因为两个不同的线程可能会同时添加同一个对象,那些线程将检查相同的LastNumberEntity以获取LastNumber值。这个问题在entityframework中有一个已知的解决方案。该代码可以是这样的:
public int GetNumber(Kind idKind)
{
using (var db = new MyDataContext())
{
var lastNumber = db.LastNumbers.Single(x=>x.IdKind == idKind);
for (int attemps = 0; attemps < 10;)
{
try
{
lastNumber.LastNumber++;
db.SaveChanges();
return lastNumber.LastNumber;
}
catch (DbUpdateConcurrencyException ex)
{
attemps++;
}
}
}
throw new Exception("Many concurrency calls");
}
这种方法获取指定类递增数字和处理并发问题,使用它,我们可以设置每个myEntity所对象的数值。客户端代码可能看起来是这样的:
var entity = new MyEntity();
var number = GetNumber(entity.IdKind);
entity.Number = number;
db.MyEntities.Add(entity);
db.SaveChanges();
这个代码可以重构,使制定者专用,使一家工厂,以确保始终使用的是GetNumber方法和使用存储库来管理数据库中创建的实体。