#c# #sql-server #entity-framework-core
Вопрос:
У меня есть проект C#/WPF, использующий ядро Entity Framework 5.0. У меня проблема с извлечением и сохранением изменений в записи, которая имеет свойства bool. Эти значения bool сохраняются в SQL Server как тип данных «бит». смотреть ниже:
Order orderItem = new Order();
orderItem.IsVATIncluded = true;
orderItem.IsBubbleWrapUsed = false;
using(var db = new MyAppDbContext())
{
db.Orders.Add(orderItem);
db.SaveChanges();
}
Ниже приводится модельное определение класса заказа:
public class Order
{
[Key]
public int Id { get; set; }
public bool IsVATIncluded { get; set; }
public bool IsBubbleWrapUsed { get; set; }
}
Запись заказа считывается из базы данных в соответствующую сетку данных, а затем запись заказа отображается в диалоговом окне.
private void ViewRecordButton_Click(object sender, RoutedEventArgs e)
{
Order orderRecord = (Order)OrderDataGrid.SelectedItem;
OrderEntry dialog = new OrderEntry(_dbContext, orderRecord);
}
Вот XAML-код OrderEntry:
<CheckBox Content="Use Bubble Wrap" IsChecked="{Binding Path=OrderItem.IsBubbleWrapUsed}" />
<CheckBox Content="VAT Included" IsChecked="{Binding Path=OrderItem.IsVATIncluded}" />
При нажатии кнопки OK диалогового окна ввода заказа изменения в записи заказа будут сохранены в базе данных. Однако при вызове функции SaveChanges() появляется ошибка исключения.
private void btnOK_Click(object sender, RoutedEventArgs e)
{
_dbContext.Orders.Update(OrderItem);
_dbContext.SaveChanges();
}
Сообщение об ошибке исключения выглядит следующим образом:
Поток протокола удаленного вызова процедур (RPC) входящего потока табличных данных (TDS) неверен. Параметр 4 («@p0»): Указанное значение не является допустимым экземпляром типа данных float. Проверьте исходные данные на наличие недопустимых значений. Примером недопустимого значения являются данные числового типа с масштабом, превышающим точность.
Исключение НЕ возникает, если свойства bool записи заказа не введены вручную. То есть, когда эти значения bool обновляются пользователем с помощью флажков диалогового окна, такая ошибка исключения НЕ возникает, когда запись была получена позже, изменения обновлены и сохранены в базе данных. Однако, когда эти значения bool вводятся вручную, как указано выше, появляется ошибка исключения.
В чем проблема?
Комментарии:
1. Это должно быть что-то, связанное с
Add
операцией соfalse
значением в этом свойстве. Вы настроили для него значение по умолчанию (напримерHasDefaultValue
, илиHasDefaultValueSql
)? Потому что существует известная проблема с такими свойствами (числовое значение с нулем, bool с ложью и т.д. — по умолчанию для типа CLR), Которые не отправляются для команды create. Включите ведение журнала EF Core с включенной опцией «Конфиденциальные данные» и просмотритеINSERT
команду, выданную EF Core, и ее параметры/значения.
Ответ №1:
Ваша ошибка показывает, что база данных ожидает значение с плавающей запятой, а не логическое значение. Согласно Microsoft логические значения должны быть сериализованы как битовое значение.
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
Я предполагаю, что ваша база данных подчиненных, следовательно, неверна, и вам нужно ее перестроить и изменить столбцы с плавающей точкой на тип «бит».