Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架,防止重复记录,同时连接_C#_Entity Framework_Asp.net Web Api_Asp.net Web Api2_Duplicates - Fatal编程技术网

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

C# 实体框架,防止重复记录,同时连接,c#,entity-framework,asp.net-web-api,asp.net-web-api2,duplicates,C#,Entity Framework,Asp.net Web Api,Asp.net Web Api2,Duplicates,如果我使用实体框架作为MVC Web API的后端,那么一个控制器可能看起来像这样(快速模型): 问题在于,如果每隔几秒钟调用此操作50、100次(可能不是一个好例子),则很可能会使用相同的电子邮件地址添加多个条目 如果val参数是Person的列表,您可以检查changetracker以查看在您SaveChanges()之前是否有人添加了电子邮件地址,但当您有大量来自不同来源的呼叫时,这不起作用 您也不能有静态的DBContext,因为它会抛出一个异常,表示它正忙 我确实想到的一个想法是相同的

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

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

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

您也不能有静态的
DBContext
,因为它会抛出一个异常,表示它正忙

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

你怎么避开这个

这个例子与我正在做的事情无关,只是一些简单的事情来解释这个场景。我想不必太具体

谢谢


史蒂夫

我不知道这项服务的消费者是谁或是什么。但是为什么同一个用户每秒会被添加多次呢? 具有相同电子邮件地址的人的多个添加项应表示同一人,但其他属性可能不同。问题是你想“赢”,第一个还是最后一个


一种简单而有效的方法是在数据库中的Email属性上设置一个唯一的约束,并以适当的方式处理异常。

如果不需要实时更新数据库,还可以将每个请求排队,只需要一个工人来处理排队的请求。

在电子邮件表上放置一个唯一的约束索引? 或 是否将SQL事务隔离级别更改为可序列化? 或 锁定一个静态对象,使一个方法一次可以通过该方法


是什么让一个新人与众不同?是否允许多人使用相同的电子邮件地址?如果没有,那么电子邮件属性的唯一约束肯定会有所帮助。你也应该考虑为什么这个操作经常被重复的信息调用。我不只是需要防止复制,我可能需要拉和现有的链接,可以创建0.00万亿毫秒之前,并将其链接到一个新的记录。这个例子显然不是最好的。它实际上是用于数据导入的,将有5-20个工作角色/线程从多个源执行相同的操作,所有这些操作都放在同一个数据库中。这是我唯一的选择,但我希望避免类似的事情,因为这样会减慢速度。只需避免锁定,以避免支付其开销,如果您不能放弃并行性,您可以设置“主”工作程序,使一组消息出列,并让后者过滤掉重复的消息,然后为每个唯一的消息指定代理。此设置还将消除web服务的负担,因为处理负担将传递给工作者。
   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();
            }
        } 
   }