【问题标题】:Write List <> to the database asp.net将 List <> 写入数据库 asp.net
【发布时间】:2020-02-07 13:07:22
【问题描述】:
  • 我一直无法写入数据库

  • 别让我出错

  • 写命令不起作用

控制者:

[HttpPost]
public async Task<ActionResult>PartialTabelaEcp(string userDate)
{
     var numerMiesiaca = 1;
     var numerRoku = 1;
     var dbExists = _ecpContext.Karta.FirstOrDefault(f => f.DzMiesiaca == 1 && f.Miesiac == 
                             numerMiesiaca && f.Rok == numerRoku && f.Login == userName);
    if (dbExists == null)
    {
        List<Karta_Model> objKartaModel = new List<Karta_Model>();

        for (int i = 1; i <= liczbaDni; i++)
        {
            DateTime thisDate = new DateTime(numerRoku, numerMiesiaca, i);

            var day = culture.DateTimeFormat.GetDayName(thisDate.DayOfWeek);
            var model = new Karta_Model()
            {
                DzMiesiaca = i,
                DzTygodnia = day,
                Rozpoczecie = "00:00"
            };

            objKartaModel.Add(model);
        }

        await _ecpContext.Karta.AddRangeAsync(objKartaModel);
        await _ecpContext.SaveChangesAsync();
    }
}

return PartialView("_TabelaEwidencja" );
  • 在 _ecpContext.Karta.AddRangeAsync(objKartaModel) 中,在 objKartaModel 中,我有一个模型列表,与“i”一样多

型号:

public partial class Karta_Model
{
    public int? DzMiesiaca { get; set; }
    public string? DzTygodnia { get; set; }
    public string? Rozpoczecie { get; set; } 
}

【问题讨论】:

  • 您正在使用异步方法,但在移动到下一个命令之前没有等待结果。
  • @ADyson ,我怎么能以编程方式做到这一点?
  • 看来你可能需要学习一些介绍性的异步编程教程——既要了解异步可以用于什么,以及如何使用它。 tldr:要么让你的外部方法async 然后await 方法,或者使用这些方法的同步版本。在这种情况下,使用 async/await 模式通常是有利的,因为它在执行数据库操作时释放了 .NET 代码中的线程,这意味着您的服务器有更多的能力来响应其他请求。

标签: c# asp.net sql-server asp.net-mvc asp.net-core


【解决方案1】:

您的方法正在调用async 操作:

_ecpContext.Karta.AddRangeAsync(objKartaModel);
_ecpContext.SaveChangesAsync();

所以你需要等待他们:

await _ecpContext.Karta.AddRangeAsync(objKartaModel);
await _ecpContext.SaveChangesAsync();

为此,您的方法还需要为async

public async Task<ActionResult> PartialTabelaEcp(string userDate)

如果您不等待异步操作,则代码会在它们完成之前继续执行,因此当您到达 SaveChangesAsync 时,没有什么可保存的。 (并且该操作本身可能会失败,而您没有观察到失败。)

【讨论】:

    【解决方案2】:

    正如@ADyson 提到的,您在同步代码中使用了异步方法。所以要么需要让你的代码异步(就像@David 或@Amankhani MohammadJavad 一样)或者让你的方法同步。 EF 为您提供AddRangeSaveChanges 两种方式。

    改变

     _ecpContext.Karta.AddRangeAsync(objKartaModel);
     _ecpContext.SaveChangesAsync();
    

     _ecpContext.Karta.AddRange(objKartaModel);
     _ecpContext.SaveChanges();
    

    【讨论】:

    • ...因为?不要只是将代码转储给某人。解释你的更改意味着什么以及它为什么起作用(以及任何影响,例如,在这种情况下,失去异步 I/O 操作的优势。)否则,不真正理解这个主题的人可能只是盲目地复制和粘贴你的代码没有理解它。而你wouldn't want that
    • 你已经解释了:)
    • 我已经部分解释过了。但是,如果您想避免投票,您仍然应该将其更完整地添加到答案正文中......
    【解决方案3】:

    您正在使用异步方法,但您的方法不是异步方法您可以这样做:

      [HttpPost]
    public async Task<ActionResult> PartialTabelaEcp(string userDate)
            {
                 var numerMiesiaca = 1;
                 var numerRoku = 1;
                 var dbExists = _ecpContext.Karta.FirstOrDefaultAsync(f => f.DzMiesiaca == 1 && f.Miesiac == 
                                               numerMiesiaca && f.Rok == numerRoku && f.Login == userName);
                if (dbExists == null)
                {
                    List<Karta_Model> objKartaModel = new List<Karta_Model>();
    
                    for (int i = 1; i <= liczbaDni; i++)
                    {
                        DateTime thisDate = new DateTime(numerRoku, numerMiesiaca, i);
    
    
                        var day = culture.DateTimeFormat.GetDayName(thisDate.DayOfWeek);
                        var model = new Karta_Model()
                        {
                            DzMiesiaca = i,
                            DzTygodnia = day,
                            Rozpoczecie = "00:00"
                        };
    
                        objKartaModel.Add(model);
    
                    }
    
    
                    await _ecpContext.Karta.AddRangeAsync(objKartaModel);
                    await _ecpContext.SaveChangesAsync();
                }
    
            }
     return PartialView("_TabelaEwidencja" );
    

    【讨论】:

    • 您忘记等待方法内的异步调用。如果您不这样做,那么您将无法解决问题。
    • 你不能说这是一个有缺陷的解决方案,可以这样解决这个问题在哪里?
    • 抱歉,在我写信的时候,我的页面没有更新你在哪里添加了await。我现在已经删除了我的第二条评论。但是,我确实认为您还应该在答案中添加文字,解释为什么 await 也是解决方案的必要部分,就像其他答案所做的那样。
    • 我想尽快完成工作并解决他们的问题,谢谢
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多