Тип Данных Bool

#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

Я предполагаю, что ваша база данных подчиненных, следовательно, неверна, и вам нужно ее перестроить и изменить столбцы с плавающей точкой на тип «бит».