【发布时间】:2021-11-18 05:39:02
【问题描述】:
我有一个使用 Entity Framework Core 5.0 的 C#/WPF 项目。我在检索和保存更改具有布尔属性的记录时遇到问题。这些布尔值在 SQL Server 中保存为“位”数据类型。见下文:
Order orderItem = new Order();
orderItem.IsVATIncluded = true;
orderItem.IsBubbleWrapUsed = false;
using(var db = new MyAppDbContext())
{
db.Orders.Add(orderItem);
db.SaveChanges();
}
Order类的模型定义如下:
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);
}
这是 OrderEntry 的 XAML 代码:
<CheckBox Content="Use Bubble Wrap" IsChecked="{Binding Path=OrderItem.IsBubbleWrapUsed}" />
<CheckBox Content="VAT Included" IsChecked="{Binding Path=OrderItem.IsVATIncluded}" />
当单击 OrderEntry 对话框的 OK 按钮时,Order 记录中的更改将被持久化到数据库中。但是调用 SaveChanges() 时会弹出异常错误。
private void btnOK_Click(object sender, RoutedEventArgs e)
{
_dbContext.Orders.Update(OrderItem);
_dbContext.SaveChanges();
}
异常错误信息如下:
传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 4 ("@p0"):提供的值不是浮点数据类型的有效实例。检查源数据中的无效值。一个无效值的例子是小数位数大于精度的数值类型数据。
当订单记录的布尔属性未手动输入时,不会发生异常。也就是说,当用户通过对话框窗口的复选框更新这些布尔值时,当稍后检索记录、更新更改并保存到数据库中时,不会发生此类异常错误。但是,当像上面那样手动输入这些 bool 值时,就会弹出异常错误。
有什么问题?
【问题讨论】:
-
它必须与
Add操作相关,并且该属性中有false值。您是否为其配置了默认值(例如HasDefaultValue或HasDefaultValueSql)?因为没有为创建命令发送此类属性(数字为零,布尔值为 false 等 - CLR 类型的默认值)存在一个已知问题。在启用敏感数据选项的情况下打开 EF Core 日志记录,并查看 EF Core 发出的INSERT命令及其参数/值。
标签: c# sql-server entity-framework-core