EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。

e.g.  2.1999将会被保存为2.20

网上找到常见的方法为重写DbContext的OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>().Property(x => x.Price).HasPrecision(18, 4);
}

但如果数据表多或者Decimal类型字段多的话,用OnModelCreating的方法将会变得相当冗余,而且不便管理。

我推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。

e.g.

其中 [DecimalPrecision(18, 4)]即是我们自定义的精度Attribute

具体实现代码如下:

/// <summary>
/// <para>自定义Decimal类型的精度属性</para>
/// </summary>
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class DecimalPrecisionAttribute : Attribute
{ #region Field
private byte _precision = ;
public byte _scale = ;
#endregion #region Construct
/// <summary>
/// <para>自定义Decimal类型的精确度属性</para>
/// </summary>
/// <param name="precision">precision
/// <para>精度(默认18)</para></param>
/// <param name="scale">scale
/// <para>小数位数(默认4)</para></param>
public DecimalPrecisionAttribute(byte precision = , byte scale = )
{
Precision = precision;
Scale = scale;
}
#endregion #region Property
/// <summary>
/// 精确度(默认18)
/// </summary>
public byte Precision
{
get { return this._precision; }
set { this._precision = value; }
} /// <summary>
/// 保留位数(默认4)
/// </summary>
public byte Scale
{
get { return this._scale; }
set { this._scale = value; }
}
#endregion
} /// <summary>
/// 用于modelBuilder全局设置自定义精度属性
/// </summary>
public class DecimalPrecisionAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
{
public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
{
if (attribute.Precision < || attribute.Precision > )
{
throw new InvalidOperationException("Precision must be between 1 and 38.");
}
if (attribute.Scale > attribute.Precision)
{
throw new InvalidOperationException("Scale must be between 0 and the Precision value.");
}
configuration.HasPrecision(attribute.Precision, attribute.Scale);
}
}

再在DbContext重写OnModelCreating,添加自定义的DecimalPrecisionAttributeConvention即可以方便地任意添加需要精度控制的字段。

public class Project_DbContext : DbContext
{
public Project_DbContext() : base("DefaultConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
base.OnModelCreating(modelBuilder);
} }

最新文章

  1. Android零碎知识
  2. 主机巡检脚本:OSWatcher.sh
  3. [WPF系列]-参考文献
  4. Java并发编程核心方法与框架-Executors的使用
  5. 如何做好App的引导页?(转)
  6. c++ 迭代器库
  7. SQLserver2012 修改数据库架构
  8. bootstrap bootstrapTable 隐藏列
  9. c# List&lt;int&gt; 转 string 以及 string [] 转 List&lt;int&gt;
  10. 百度编辑器1.4.3 .net版在vs2008的使用方法
  11. Android经常使用的五种弹出对话框
  12. 邻里街坊 golang入坑系列
  13. JS 的骚操作
  14. js 时间动画优化
  15. A1036. Boys vs Girls
  16. java判断字符串中是否包含中文 过滤中文
  17. SqlServerDBCC SHRINKFILE不起作用
  18. 用Docker下搭建GitLab
  19. TFS分布式文件系统
  20. js 俄罗斯方块源码,简单易懂

热门文章

  1. Android模糊演示样例-RenderScript-附效果图与代码
  2. database工具
  3. rails引入bootstrap
  4. 解决Eclipse下不自动拷贝apk到模拟器问题( The connection to adb is down, and a severe error has occured)
  5. ios开发杂项(基础性介绍等)
  6. GObject对象系统
  7. C++ STL中Map的按Value排序
  8. Nunit2.5.10快速上手(笔记)
  9. CentOS下febootstrap自制Docker的CentOS6.6和7.1 Docker镜像
  10. jquery mobile 的loading提示“正在加载...”在不同版本中的不同实现方式