【发布时间】:2017-11-22 16:52:06
【问题描述】:
我正在使用 WebAPI 和 Entity Framework 6 开发一个项目。
有一个控制器带有一个方法,可以将一个新的实体任务添加到数据库中。在添加任务之前为它计算了一个唯一的名称。部分名称基于数据库中已保存的任务。如果你发出两个并行请求,你可以生成相同的名字,这个问题是通过锁来解决的。
如果两个 WebAPI 服务器正在运行并连接到同一个数据库,我如何防止生成相同的名称?
是否可以在数据库级别添加将Task添加到顺序队列的算法?
简化代码:
[HttpPost]
[Route("add")]
public IHttpActionResult AddTask()
{
using (var db = CreateDbContext())
{
Task task = new Task();
lock (lockAdd)
{
DateTime dateTime = DateTime.UtcNow;
string preName = dateTime.ToString("yyMMdd-HHmm-");
var query = db.Tasks.Where(t => t.Name.StartsWith(preName)).Select(t => t.Name);
List<string> tasksNames = query.ToList();
task.Name = preName + (tasksNames.Count + 1).ToString("D4");
db.Tasks.Add(task);
db.SaveChanges();
}
return Ok();
}
}
Сolumn "Name" 不能是唯一的。 任务从未删除。 对于每个新日期(新分钟),计数器必须从 1 开始。
【问题讨论】:
-
最简单的方法可能是将逻辑添加到数据库中并从那里返回值(可能是插入触发器)。这样,它将始终得到妥善处理。否则,无论如何您都必须拥有一个唯一索引并在插入相同名称时处理异常。
标签: c# postgresql asp.net-web-api entity-framework-6