EF:为什么更新数据库时数字类型列变成0

本文关键字:类型 数字 为什么 更新 数据库 EF | 更新日期: 2023-09-27 18:04:18

我使用ef和反射来实现更新指定的列。字符串列可以正确执行,当我更新1次时,数字类型列已经改变,第二次我发现它已经变成0;

public void UpdateSpecified(T entity)
    {
        var props = entity.GetType().GetProperties();
        foreach (var prop in props)
        {
            if (prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string))
            {
                string propValue = prop.GetValue(entity, null) != null ? prop.GetValue(entity, null).ToString() : string.Empty;
                if (!string.IsNullOrEmpty(propValue))
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = true;
                }
                else
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = false;
                }
            }
        }
    }

服务层代码:

    g.Id = good.Id;
    g.GoodsQuantity = good.GoodsQuantity - 1;
    goodsRepo.Attach(g);
    goodsRepo.UpdateSpecified(g);
    _repositoryFactory.Commit();

EF:为什么更新数据库时数字类型列变成0

我已经解决了。首先你必须定义你的数字类型模型为Nullable type

    public float? GoodPrice { get; set; }
    public float? GoodScore { get; set; }
    public int? GoodsQuantity { get; set; }
第二:你应该像这样修改你的ef映射类:
    this.Property(x => x.GoodsQuantity).IsRequired();
    this.Property(x => x.GoodPrice).IsRequired();
    this.Property(x => x.GoodScore).IsRequired();
第三:你应该像这样修改你的代码:
  public void UpdateSpecified(T entity)
    {
        var props = entity.GetType().GetProperties();
        foreach (var prop in props)
        {
            if (prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string)
                ||(prop.PropertyType.IsGenericType&& prop.PropertyType.GetGenericTypeDefinition()==typeof(Nullable<>)))
            {
                string propValue = prop.GetValue(entity, null) != null ? prop.GetValue(entity, null).ToString() : string.Empty;
                if (!string.IsNullOrEmpty(propValue))
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = true;
                }
                else
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = false;
                }
            }
        }
    }
最后,它可以正确地更改它。xd