实体框架,防止重复记录,同时连接

Ste*_*tes 5 c# entity-framework duplicates asp.net-web-api asp.net-web-api2

如果我使用实体框架作为MVC Web API的后端,一个控制器可能看起来像这样(快速模型):

   public class PersonController : ApiController
   {
        [HttpPost]
        public void AddPerson(Person val)
        {
            DbContext context = new DbContext();
            if(!context.Persons.Any(x=>x.Email == val.Email))
            {
                context.Persons.Add(val)
                context.SaveChanges();
            }
        } 
   }
Run Code Online (Sandbox Code Playgroud)

问题在于,如果此操作被称为50,每隔几秒100次(可能不是一个好例子),则很可能可以使用相同的电子邮件地址添加多个条目.

如果val参数是一个列表,Person您可以检查changetracker以查看是否有人在您之前添加了电子邮件地址,SaveChanges()但是当您有来自不同来源的大量呼叫时,这不起作用.

你不能有一个静态DBContext,因为它会抛出一个异常,说它很忙.

我想到的一个想法是相同的设置,但有一个静态方法,它返回一个实例(相同的实例),dbcontextlock()在其上创建一种类似的队列,但这可能会影响性能,这不是一个好主意.

你怎么解决这个问题?

这个例子与我正在做的事情无关,只是简单地解释一下这个场景.我猜它也不一定具体.

谢谢

史蒂夫

小智 0

如果您不需要实时更新数据库,您不妨对每个请求进行排队,并且只使用一个工作程序来处理排队的请求。