C# 实体框架,防止重复记录,同时连接
如果我使用实体框架作为MVC Web API的后端,那么一个控制器可能看起来像这样(快速模型): 问题在于,如果每隔几秒钟调用此操作50、100次(可能不是一个好例子),则很可能会使用相同的电子邮件地址添加多个条目 如果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,因为它会抛出一个异常,表示它正忙 我确实想到的一个想法是相同的
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();
}
}
}