【问题标题】:save async with EF in foreach在 foreach 中保存与 EF 的异步
【发布时间】:2018-08-25 05:46:54
【问题描述】:

我想通过在 Foreach 循环中迭代来保存我的对象,并将结果返回给我的控制器

这是控制器代码:

public async Task<HttpResponseMessage> PostSubmissionFirm(JArray ParamList)
{

    logger.Info(string.Format("----------  PricingController Information //// PostSubmissionFirm"));

    if (ParamList.Count > 0)
    {
        try
        {
            string xxx1 = null;
            string xxxx2 = null;
            string xxxx3 = null;
            string xxxx4 = null;

            Cccier Ci = new Cccier (ParamList);
            List<string> verify = Ci.VerifObject();
            if (verify.Count == 0)
            {


                var Premium =  Ci.calculate();


                HttpResponseMessage response = new HttpResponseMessage { StatusCode = HttpStatusCode.Created };
                return new HttpResponseMessage()
                {
                    StatusCode = HttpStatusCode.OK,
                    Content = new JsonContent(new { Premium = Premium, , DateExpire = DtExp.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) })
                };
            }
            else
            {
                HttpError err = new HttpError(message);
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, err);
            }
        }
        catch (Exception e)
        {

        }
    }
}

我调用的方法计算结果是:

public async Task<string> calculate()
{
    int i = 1;
    foreach (var Contextli in qlimit)
    {

        Prem= Prm <= 1500 ? 1500 : Math.Round(Premium, 2);
        double Adnal1 = 100;
        double Adnal2 = Math.Round(Adnal1, 2);

        Submi SubRep = new Submi ();
        SubRep.IdSouSubmi  = 90;
        SubRep.IdPremm= i;
        SubRep.IdLi = Idl;
        SubRep.IdFran = idf;

        db.Submi.Add(SubRep);
        await db.SaveChangesAsync();            
    }

    string JSONString = string.Empty;
    JSONString = JsonConvert.SerializeObject(dt);
    return JSONString;
}

但我在 foreach 循环的第一次迭代后立即收到一条错误消息:

错误:500Internal Server Error{“消息”:“Une erreur s'est produite lors du démarrage d'une transaction sur la connexion dufournisseur。Pour plus d'informations, Consultez l'exception interne。” }

【问题讨论】:

  • 看看你内心的异常(interne异常)。这可能(几乎 100% 肯定)因为每次迭代都使用相同的 DbContext 并且 EF 的 DbContext 不是线程安全的
  • 我想这就是问题所在。但是我怎样才能为每次迭代创建 dbcontetext 线程。还有 thkxxx
  • 首先,当错误信息不是英文时,很难获得帮助。请参阅:How to Ask 和 How to write a Minimal, Complete, and Verifiable example。

标签: c# entity-framework async-await


【解决方案1】:

问题出在这一行:

var Premium = Ci.calculate();

如果您没有使用var,您会发现Premium 不是string,而是Task&lt;string&gt;。

简单修复:

var Premium = await Ci.calculate();

注意 1:该行中没有任何内容遵循 c# 约定,应该类似于

var premium = await Ci.CalculateAsync();

注意 2:calculate 返回一个 JSON 字符串,而您将返回 JsonContent,因此 premium 最终将被序列化两次。 calculate 应该返回实际的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2012-10-15
    • 2012-06-16
    • 2014-03-12
    • 2020-01-15
    • 2019-04-03
    相关资源
    最近更新 更多