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

时间:2016-08-26 06:34:37

标签: c# asp.net entity-framework

我使用ef和reflection来实现更新指定的列。 字符串列可以执行正确,当我更新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();

1 个答案:

答案 0 :(得分:-1)

我解决了它。 首先,您必须将数字类型模型定义为 Nullable 类型

    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