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
Entity framework Entityframework并发性_Entity Framework_Asp.net Web Api_Concurrency - Fatal编程技术网

Entity framework Entityframework并发性

Entity framework Entityframework并发性,entity-framework,asp.net-web-api,concurrency,Entity Framework,Asp.net Web Api,Concurrency,我有以下情况: 我有两个web api函数,可以将数据删除/插入SQL Server数据库。通过.net entityframework v6处理数据访问。insert/delete方法仅从本地运行的c#程序调用。我使用HttpClient类来调用web api方法。web方法的工作原理如下:当我调用insert时,所有现有记录都将被删除,新记录将被插入,因此没有真正的更新过程 以下是我的两个功能: [HttpDelete()] public async Task<int> Dele

我有以下情况: 我有两个web api函数,可以将数据删除/插入SQL Server数据库。通过.net entityframework v6处理数据访问。insert/delete方法仅从本地运行的c#程序调用。我使用HttpClient类来调用web api方法。web方法的工作原理如下:当我调用insert时,所有现有记录都将被删除,新记录将被插入,因此没有真正的更新过程

以下是我的两个功能:

[HttpDelete()]
public async Task<int> DeleteStartlist(int eventid, int run, int heat, string category)
{
    _data.dbsStartlistEntries.RemoveRange(_data.dbsStartlistEntries.Where(s => s.Event.Id == eventid && s.RoundOrder == run && s.HeatOrder == heat && s.Category == category));
    return await _data.SaveChangesAsync();
}

[HttpPost()]
public async Task<int> UpdateStartlists(int eventid, List<StartlistEntry> en)
{
    try
    {
        if (en.Count == 0)
            return 0;

        var xdel = await DeleteStartlist(eventid, en[0].RoundOrder, en[0].HeatOrder, en[0].Category);
        var ev = await _data.dbsEvents.FindAsync(eventid);
        if (ev != null)
        {
            en.ForEach(e => e.Event = ev);
            _data.dbsStartlistEntries.AddRange(en);
        }
        return await _data.SaveChangesAsync();
    }
    catch (System.Exception ex)
    {
        return 1;
    }
}
[HttpDelete()]
公共异步任务DeleteStartlist(int-eventid、int-run、int-heat、字符串类别)
{
_data.dbstackistentries.RemoveRange(_data.dbstackistentries.Where(s=>s.Event.Id==eventid&&s.RoundOrder==run&&s.HeatOrder==heat&&s.Category==Category));
返回wait_data.SaveChangesAsync();
}
[HttpPost()]
公共异步任务UpdateStartList(int-eventid,List-en)
{
尝试
{
如果(en.Count==0)
返回0;
var xdel=await DeleteStartlist(eventid,en[0]。RoundOrder,en[0]。HeatOrder,en[0]。类别);
var ev=wait_data.dbsEvents.FindAsync(eventid);
如果(ev!=null)
{
en.ForEach(e=>e.Event=ev);
_data.dbstatistentries.AddRange(en);
}
返回wait_data.SaveChangesAsync();
}
catch(System.Exception-ex)
{
返回1;
}
}
但现在我有以下问题。例如,当我连续10次调用Update方法而不在函数调用之间等待时,我会收到以下异常:

Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。刷新ObjectStateManager条目

对我来说,这听起来像是一个并发问题,但我真的不知道如何解决它。
所以我的问题是,有没有一种方法可以让api调用在服务器端互相等待,或者它们总是并发运行,或者有没有一种方法可以锁定数据库?

在哪里定义了
\u data
?您是否在多个请求中使用相同的数据上下文?至于让他们互相等待,怎么称呼他们?通常情况下,使用的代码将管理操作的同步。\u数据是在API类中定义的,您认为我应该在方法中定义它吗?当然可以。(我会的,除非我有明确的理由不这样做。)让我澄清一下。。。它是如何定义的?例如,如果它是
静态的
,或者以其他方式在请求之间共享,那么您将遇到各种并发问题。您肯定希望确保对该web服务的任何给定原子请求都封装了它自己的独立数据上下文。虽然这完全有可能与错误无关。只是一个猜测。如果这真的是一个并发问题(比如一个请求在另一个并发请求已经删除了该记录后,对它知道的记录发出了一个
DELETE
),那么您可能从这里开始:这实际上是一个定义逻辑应该如何处理并发的问题,通常属于为数不多的已知并发模型之一。数据不是静态的,我有一个名为API的类,数据是该类的私有非静态成员。