使用实体framewrk以c#Windows形式将多个项目添加到数据库

时间:2019-01-07 08:50:00

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

我想使用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”属性。

4 个答案:

答案 0 :(得分:0)

DbNull无法转换为Int32。如果您的值可以为null,则您的媒体资源必须为空。

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

和您的代码

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

富特莫尔,看来您有ModelValidationError。在这种情况下,您需要检查EntityValidationErrors以了解您的模型到底出了什么问题。

答案 1 :(得分:0)

根据您的错误消息,似乎您的某些字段可能已在数据库中设置为NOT NULL,并且您尝试将NULL放入。您可以在VS中的“异常”中检查EntityValidationErrors字段-确切的信息是哪些字段不正确

答案 2 :(得分:0)

您必须先检查null

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

答案 3 :(得分:-1)

  • 使用此代码以及显示消息框时使用

     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);
    
    }