【问题标题】:multiple items add to database in c# windows form using entity framewrk使用实体框架将多个项目添加到 c# windows 窗体中的数据库
【发布时间】:2019-01-07 08:49:59
【问题描述】:

我想使用 datagridview 中的实体框架向数据库添加多个项目,但在 SaveChanges() 方法中总是出错。

这是我的保存按钮代码

foreach (DataGridViewRow row in SaleGrid.Rows)
{
    var saleProduct = new SaleProduct
    {
        SalesId = Convert.ToInt32(txtInvoice.Text),
        CatId = Convert.ToInt32(row.Cells["CatId"].Value ?? DBNull.Value),
        CatQuiltyId = Convert.ToInt32(row.Cells["QualityId"].Value ?? DBNull.Value),
        SuitDesignId = Convert.ToInt32(row.Cells["DesignId"].Value ?? DBNull.Value),
        SaleType = Convert.ToInt32(row.Cells["TypeId"].Value ?? DBNull.Value),
        StockId = Convert.ToInt32(row.Cells["StockId"].Value ?? DBNull.Value),
        Price = Convert.ToString(row.Cells["Price"].Value ?? DBNull.Value)
    };
    Db.SaleProducts.Add(saleProduct);
    Db.SaveChanges();
}

public partial class SaleProduct
{

    public int Id { get; set; }
    public Nullable<int> SalesId { get; set; }
    public Nullable<int> CatId { get; set; }
    public Nullable<int> CatQuiltyId { get; set; }
    public Nullable<int> SuitDesignId { get; set; }
    public Nullable<int> CustomerId { get; set; }
    public Nullable<int> SaleType { get; set; }
    public Nullable<int> StockId { get; set; }
    public string Price { get; set; }

EntityFramework.dll 中出现“System.Data.Entity.Validation.DbEntityValidationException”类型的未处理异常

附加信息:一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

【问题讨论】:

  • 错误是什么?请在您的问题中添加错误详细信息
  • EntityFramework.dll 中出现“System.Data.Entity.Validation.DbEntityValidationException”类型的未处理异常附加信息:一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
  • 您需要通过编辑问题在帖子中包含错误详细信息。顺便说一句,请包括您的错误中所述的EntityValidationErrors
  • @MuhammadKaleem 你能在问题中添加 SaleProduct 类吗
  • 问题中添加了SaleProduct类

标签: c# database winforms entity-framework desktop-application


【解决方案1】:

根据您的错误消息,您的某些字段可能在数据库中设置为 NOT NULL,而您尝试输入 NULL。您可以在 VS 的 Exception 中检查字段 EntityValidationErrors - 将会有哪些字段不正确的确切信息

【讨论】:

  • 在数据库中只有主键字段为 Nullable
  • 据我所知,主键不能为空。可能在您的模型中的 c# 属性设置为 not null 并且您尝试将 null 放入其中。你在 VS 的异常中检查过 EntityValidationErrors 吗?
  • 主键自动递增
  • EntityValidationErrors 怎么样?您还可以添加以质疑您的表架构吗?
【解决方案2】:

DbNull 无法转换为 Int32。如果您的值可以为空,那么您的属性需要可以为空。

public MyClass 
{
    public int? NullableProp {get; set;}
}

和你的代码

var saleProduct = new SaleProduct
{
     NullableProp = String.IsNullOrEmpty(txtInvoice.Text) ? (int)null :
          Convert.ToInt32(txtInvoice.Text),
     ....
}

此外,您似乎遇到了 ModelValidationError。在这种情况下,您需要检查 EntityValidationErrors 以了解您的模型到底出了什么问题。

【讨论】:

    【解决方案3】:

    你必须先检查null

    row.Cells["Price"] is null ? DBNull.Value:Convert.ToString(row.Cells["Price"].Value)
    

    【讨论】:

      【解决方案4】:
      • 使用此代码并在消息框显示时使用

         ctrl + c
        
      • 复制消息

      • 然后发到这里

        try {
        
        foreach (DataGridViewRow row in SaleGrid.Rows)
        {
            var saleProduct = new SaleProduct
            {
                SalesId = Convert.ToInt32(txtInvoice.Text),
                CatId = Convert.ToInt32(row.Cells["CatId"].Value ?? DBNull.Value),
                CatQuiltyId = Convert.ToInt32(row.Cells["QualityId"].Value ?? DBNull.Value),
                SuitDesignId = Convert.ToInt32(row.Cells["DesignId"].Value ?? DBNull.Value),
                SaleType = Convert.ToInt32(row.Cells["TypeId"].Value ?? DBNull.Value),
                StockId = Convert.ToInt32(row.Cells["StockId"].Value ?? DBNull.Value),
                Price = Convert.ToString(row.Cells["Price"].Value ?? DBNull.Value)
            };
            Db.SaleProducts.Add(saleProduct);
            Db.SaveChanges();
        }
        
        
        }
        catch (Exception e)
        {
          var messages = new List<string>();
          do
          {
            messages.Add(e.Message);
            e = e.InnerException;
          }
          while (e != null) ;
          var message = string.Join(" - ", messages);
          MessageBox.Show(message);
        
        }
        

      【讨论】:

      • 非常感谢。在尝试捕获块后我成功保存
      • @MuhammadKaleem 怎么样?消息框出现了吗?
      • @MuhammadElrashid 消息框未显示。但工作正常
      • 请检查您的代码是否出现此错误。一个或多个实体的验证失败。有关更多详细信息,请参阅实体验证错误属性
      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2021-08-14
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多