修正票价字段的精度

前面我们追加数据的时候遗留下来一个问题,就是在追加数据的时候,票价(Price)字段中输入的是9.99元,但是电影清单显示画面中该数据的票价字段显示为10元,这是为什么?这个问题发生的原因是因为,当EF code-first在创建数据表的时候,如果字段为Decimal类型,则使用默认的精度(18:0),从而使得9.99元被四舍五入成为10元。现在我们想要将这个默认的精度修改为(18:2),从而使得数据表中的票价字段能够存储小数点后的两位数字。可喜的是EF code-first允许你很容易地重载这个定义模型如何向数据库中存取数据的映射规则。你可以利用这个重载机制来重载EF code-first中默认的类型定义以及数据表的继承规则,然后在这个基础上进行数据的存取。为了改变我们的票价(Price)字段在数据表中的精度,打开Models文件夹下的Movie.cs文件。追加一句引用System.Data.Entity.ModelConfiguration的语句,代码如下:

using System.Data.Entity.ModelConfiguration;

并在MovieDBContext类中重载OnModelCreating方法,代码如下所示:

public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Movie>().Property(p => p.Price).HasPrecision(, );
}
}

OnModelCreating方法可以被用来重载与定制规定我们的模型类如何与我们的数据表,进行映射的映射规则。代码中使用了EF的ModelBuilder API来定义我们的Movie对象的票价(Price)字段的精度为准确到小数点后两位。

现在完整的Movie.cs中的代码如下所示:

using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
namespace MvcMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Movie>().Property(p =>p.Price).HasPrecision(, );
}
}
}

现在让我们重新运行应用程序,在浏览器中输入“http://localhost:xx/Movies”。当应用程序启动的时候,EF code-first将会再次察觉我们的模型类中的结构与数据表的结构不再匹配,然后自动重建数据表与新的模型类的结构进行匹配(具有新的票价(Price)字段的精度)。重新创建一个新的电影(Movie)数据,在票价(Price)字段中输入9.99。请注意数据表中保存后显示在电影清单画面中的该条数据的票价(Price)字段中现在也显示为9.99了,如图所示:

本节介绍了如何快速调整你的模型对象,同时在改变模型类的结构时自动将数据表中的结构保持同步。我们也介绍了如何预先在自动重建的数据表中追加默认数据,它使得你可以快速在数据表中追加一些测试数据。在下一节中,我们将介绍如何在我们的模型类中加入我们自定义的数据有效性校验规则,从而强制实现一些业务规则。

另注:4.0以后的EFramework已经不存在该精度错误。所以越来越好了,嘻嘻。

MVC神韵---你想在哪解脱!(十四)的更多相关文章

  1. MVC神韵---你想在哪解脱!(十六)

    MVC验证属性自动验证原理 也许有人会问,既然我们没有在C与V追加任何显示错误信息提示的代码,那么控制器或视图内部是如何生成这些显示错误信息提示的画面的.让我们揭开这么谜底吧!当在Movie类中追加了 ...

  2. MVC神韵---你想在哪解脱!(十五)

    在模型中添加验证规则 本节介绍如何在我们的Movie(电影)模型中添加一些验证规则,同时确认当用户使用我们的应用程序创建或编辑电影信息时将使用这些验证规则对用户输入的信息进行检查.首先,让我们在Mov ...

  3. MVC神韵---你想在哪解脱!(十八)

    数据的修改视图 首先打开Movie控制器,添加一个返回数据修改视图的Edit()方法与一个对该视图中的表单提交进行处理的Edit()方法,代码如下所示: // GET: /Movies/Edit pu ...

  4. MVC神韵---你想在哪解脱!(十二)

    追加一条电影信息 运行应用程序,在浏览器中输入“http://localhost:xx/Movies/Create”,在表单中输入一条电影信息,然后点击追加按钮,如图所示. 点击追加按钮进行提交,表单 ...

  5. MVC神韵---你想在哪解脱!(十)

    增加追加数据的方法和视图 现在我们将要在数据库中追加并保存一些数据.我们将要创建一个表单以及一些表单输入控件,用来输入数据信息.当用户提交表单时将把这些用户输入的信息保存在数据库中.我们可以通过在浏览 ...

  6. MVC神韵---你想在哪解脱!(十七)

    实现针对数据的CRUD操作 首先,让我们来看一下如何实现一条数据的明细信息视图.为了更好地体会这一功能,首先我们在前文所述的电影清单视图(Views文件夹下面的Movies文件夹下面的Index.cs ...

  7. MVC神韵---你想在哪解脱!(十三)

    维护模型与数据库结构之间的差别 现在我们已经将应用程序修改完毕,在Movie数据模型中添加了一个Rating属性.现在让我们重新运行应用程序,打开“http://localhost:xx/Movies ...

  8. MVC神韵---你想在哪解脱!(十一)

    为了实现这一处理,我们需要在MoviesController类中追加第二个Create方法.这个Create方法具有一个[HttpPost]属性,它意味着我们将要用它来处理提交到“/Movies/Cr ...

  9. 爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)

    处理代码 file = "a.srt" fi = open(file, mode='r') a = fi.readline() i = 1 while len(str(a)) != ...

随机推荐

  1. UWP:本地应用数据

    获取应用的设置和文件容器 使用 ApplicationData.LocalSettings 属性可以获取 ApplicationDataContainer 对象中的设置. 注意:每个设置的名称最长可为 ...

  2. sqlserver 导入/导出Excel

    --从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*=========================================================== ...

  3. android错误 Android NAND: nand_dev_load_disk_state,

    Android NAND: nand_dev_load_disk_state, 总是提示上面这个错误,我以为是内存分配不足呢,但是内存足够用也不行,后来在国外的网站上看到这个问题的解答,说是把用到的A ...

  4. POJ2402 Palindrome Numbers 回文数

    题目链接: http://poj.org/problem?id=2402 题目大意就是让你找到第n个回文数是什么. 第一个思路当然是一个一个地构造回文数直到找到第n个回文数为止(也许大部分人一开始都是 ...

  5. 转载RabbitMQ入门(5)--主题

    主题(topic) (使用Java客户端) 在先前的指南中我们改进了我们的日志系统.取代使用fanout类型的交易所,那个仅仅有能力实现哑的广播,我们使用一个direct类型的交易所,获得一个可以有选 ...

  6. Vim学习总结

    Vim 目前还没感觉到比在Mac下使用Sublime Text高效到哪 安装 sudo apt-get install vim 常用配置 在Linux环境下Vim的初始化配置文件为.vimrc,通常有 ...

  7. 【html】页面制作规范文档

    每天都在写html/css/js代码,总结的一些页面制作的规范 文件命名规范 1) 文件目录.文件名称统一用小写的英文字母.数字.下划线组合,文件名要与表现的内容相近,不到万不得已不要以拼音作为名称, ...

  8. spring3.0.5的aop使用

    spring3.0.5开始支持jpa2.0了,但是最近笔者在使用他的的时候发现了3.0.5的包与2.5.5相比,有所精简.其他外部的包,我们需要自己下载. AOP必须的spring包 org.spri ...

  9. 不同语言的Unix时间戳

    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScript Math.round(new Date().getTime()/1000)ge ...

  10. 音频PCM格式

    经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 ...