【问题标题】:Why bool property with default value couldn't set with different value? [duplicate]为什么具有默认值的布尔属性不能设置为不同的值? [复制]
【发布时间】:2023-04-07 03:23:01
【问题描述】:

我已将 true 设置为我的 csharp 实体类中的布尔 Active 属性的默认值。但我不能在我的方法中将其设置为 false。我将其设置为 false,但在调用存储库模式服务实例的 Save 方法后,我再次看到它是 true。为什么会发生?

   public class BaseEntity
        {
            [Key]
            public int Id { get; set; }
    
            private DateTime createdAt;
            public DateTime CreatedAt
            {
                get
                {
                    if (createdAt == null)
                    {
                        createdAt = DateTime.Now;
                    }
                    return createdAt;
                }
                set { createdAt = value; }
            }
            public bool Active { get; set; }
            [DefaultValue(false)]
            public bool Deleted { get; set; }
            public DateTime? UpdatedAt { get; set; }
    
            public BaseEntity()
            {
                if (createdAt == null)
                {
                    CreatedAt = DateTime.Now;
                }
            }
        }

public class OrderDetail:BaseEntity
{
    public Item Item { get; set; }
    public decimal Amount { get; set; }
    public decimal Price { get; set; }
    public decimal TotalPrice { get; set; }
    public string Token { get; set; }
    public DateTime? TokenExpire { get; set; }

}

数据库保存设置为假:

       foreach (var cartItem in orderingItems)
        {
            var item = ItemService.GetById(cartItem.Item.Id);
            if (item != null)
            {
                var orderDetail = new OrderDetail
                {
                    CreatedAt=DateTime.Now,
                    Amount = cartItem.Count,
                    Item = item,
                    Price = item.Price.HasValue ? item.Price.Value : 0
                };
                orderDetail.Active = false;
                orderDetailList.Add(orderDetail);
            }
        }

        decimal totalOrderAmountValue = orderingItems.Sum(i => i.Item.Price);
       string totalOrderAmount = totalOrderAmountValue.ToString("F", CultureInfo.GetCultureInfo("en"));
        var newOrder = new Order();
        newOrder.Active = false;
        newOrder.OrderDetails = orderDetailList;

        newOrder.CreatedAt = DateTime.Now;
        newOrder.Owner = orderUser;
        OrderService.Insert(newOrder);
        OrderService.Save();

在数据库中设置默认值的迁移代码:

builder.Entity<OrderDetail>().Property<bool>("Active").HasDefaultValue(true);

【问题讨论】:

  • default(bool) == false。无法区分未修改和明确的false。相反,您可以使用带有属性get =&gt; _value ?? true;bool? 私有字段。 EF Core 应加载/保存该字段。
  • 那不是迁移,那是 DbContext 模型配置。 false 是布尔值的默认值。你在哪里设置为true?如果您想默认为false,则无需执行任何操作。你的问题是I have set true as default value of my boolean Active property
  • 我修好了。它必须是“真实的”。
  • 我要求您发布您的 EF 代码的原因是我们仍然不知道发生了什么。仍然没有将Active 的默认值设置为true 的代码。模型配置方法仍然缺失。 builder.Entity&lt;OrderDetail&gt;().Property&lt;bool&gt;("Active").HasDefaultValue(false); 只是其中的一部分。是否有一个触发器可以设置数据库中的字段?
  • 让我也检查一下触发的东西。

标签: c# entity-framework-core repository-pattern


【解决方案1】:

bool 可以有两个值,truefalse。您已将默认值设置为true。这意味着如果您进行插入,它将是 true 而不是列的默认值。该列的默认值为false。 EF 无法判断false 是设置为默认值还是明确设置为该值,因此false 的值将始终被默认true 覆盖。一种选择是使列和可为空的布尔型 (bool?)。然后默认值将是 null 并且您的显式 false 值将被保留并输入到数据库中。

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 2016-11-19
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多