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();
我已经解决了。首先你必须定义你的数字类型模型为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