Добавление нескольких элементов в базу данных в форме окна C# с использованием entity framewrk

Я хочу добавить несколько элементов в базу данных, используя структуру сущностей из 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; }

An unhandled exception of type 'System.Data.Entity.Validation.DbEntityValidationException' occurred in EntityFramework.dll

Additional information: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

в чем ошибка? пожалуйста, добавьте подробности ошибки в свой вопрос

Derviş Kayımbaşıoğlu 07.01.2019 09:54

Необработанное исключение типа System.Data.Entity.Validation.DbEntityValidationException произошло в EntityFramework.dll. Дополнительная информация: Ошибка проверки для одной или нескольких сущностей. Для получения дополнительных сведений см. Свойство EntityValidationErrors.

Muhammad Kaleem 07.01.2019 09:58

вам необходимо включить в сообщение сведения об ошибке, отредактировав вопрос. И, кстати, включите EntityValidationErrors, указанный в вашей ошибке.

Derviş Kayımbaşıoğlu 07.01.2019 10:00

@MuhammadKaleem Можете ли вы добавить класс SaleProduct к вопросу?

Mohamed Elrashid 07.01.2019 10:08

Класс SaleProduct добавлен в вопрос

Muhammad Kaleem 07.01.2019 10:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
141
4

Ответы 4

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, чтобы понять, что именно не так с вашей моделью.

Согласно вашему сообщению об ошибке, кажется, что некоторые из ваших полей, возможно, установлены как NOT NULL в базе данных, и вы пытаетесь поставить NULL. Вы можете проверить поле EntityValidationErrors в своем исключении в VS - будет точная информация, какие поля неверны

в базе данных есть только поле первичного ключа Nullable

Muhammad Kaleem 07.01.2019 10:11

Насколько мне известно, первичный ключ не может иметь значение Nullable. Возможно, в вашей модели в C# свойство установлено как ненулевое, и вы пытаетесь поместить в него null. Вы проверили EntityValidationErrors в своем исключении в VS?

Piotr Wojsa 07.01.2019 10:24

первичный ключ - автоматическое приращение

Muhammad Kaleem 07.01.2019 10:29

А как насчет EntityValidationErrors? Также не могли бы вы добавить под сомнение схему вашей таблицы?

Piotr Wojsa 07.01.2019 10:32

Вы должны сначала проверить null

row.Cells["Price"] is null ? DBNull.Value:Convert.ToString(row.Cells["Price"].Value)
  • Используйте этот код, и когда отображается окно сообщений, используйте

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

большое спасибо . после попытки поймать блок я успешно сохранил

Muhammad Kaleem 07.01.2019 12:27

@MuhammadKaleem Как ?? появилось ли окно сообщения?

Mohamed Elrashid 07.01.2019 12:29

@MuhammadElrashid Не отображается окно сообщения. но работает нормально

Muhammad Kaleem 07.01.2019 12:33

Пожалуйста, убедитесь, что эта ошибка возникает после вашего кода. проверка не удалась для одного или нескольких объектов. См. Дополнительные сведения в свойствах ошибок проверки сущностей.

Muhammad Kaleem 07.01.2019 20:08

Другие вопросы по теме