Я хочу добавить несколько элементов в базу данных, используя структуру сущностей из 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.
Необработанное исключение типа System.Data.Entity.Validation.DbEntityValidationException произошло в EntityFramework.dll. Дополнительная информация: Ошибка проверки для одной или нескольких сущностей. Для получения дополнительных сведений см. Свойство EntityValidationErrors.
вам необходимо включить в сообщение сведения об ошибке, отредактировав вопрос. И, кстати, включите EntityValidationErrors, указанный в вашей ошибке.
@MuhammadKaleem Можете ли вы добавить класс SaleProduct к вопросу?
Класс SaleProduct добавлен в вопрос





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
Насколько мне известно, первичный ключ не может иметь значение Nullable. Возможно, в вашей модели в C# свойство установлено как ненулевое, и вы пытаетесь поместить в него null. Вы проверили EntityValidationErrors в своем исключении в VS?
первичный ключ - автоматическое приращение
А как насчет EntityValidationErrors? Также не могли бы вы добавить под сомнение схему вашей таблицы?
Вы должны сначала проверить 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);
}
большое спасибо . после попытки поймать блок я успешно сохранил
@MuhammadKaleem Как ?? появилось ли окно сообщения?
@MuhammadElrashid Не отображается окно сообщения. но работает нормально
Пожалуйста, убедитесь, что эта ошибка возникает после вашего кода. проверка не удалась для одного или нескольких объектов. См. Дополнительные сведения в свойствах ошибок проверки сущностей.
в чем ошибка? пожалуйста, добавьте подробности ошибки в свой вопрос