源码学习的重要性,再一次让人信服。

ASP.NET MVC Application Using Entity Framework Code First

做MVC已经有段时间了,但看了一些CodePlex上的代码,仍然觉得需要学习的东西还很多,基本上功能都可以实现,但如果放弃去利用框架本身已经聚合与提供的便利性功能,那往往会事倍功半,即使实现,也不漂亮不专业,不舒服。

很多专业的东西都在那里,没事瞅瞅,不要动不动一上来就老三样,或者放弃好东西,用自己的老办法去经验性的解决,既然可以实现,那就要去找最漂亮的解决办法,否则何来提升。

  • 虚拟属性

//虚拟自动属性。子类可以使用overrides重写该属性,
//子类可以实现get和set访问器,以实现自定义的操作。
public virtual string Name { get; set; } // 带支持字段的虚拟属性
private int num;
public virtual int Number
{
get { return num; }
set { num = value; }
}
  • DataType

    Custom,

    DateTime,

    Date,

    Time,

    Duration,

    PhoneNumber,

    Currency,

    Text,

    Html,

    MultilineText,

    EmailAddress,

    Password,

    Url,

    ImageUrl,

    CreditCard,

    PostalCode,

    Upload,

    很多常用的验证都已经被封装好了,只需要用就可以了,不要再费劲的写正则了,亲。

MetadataTypeAttribute

[MetadataType(typeof(CustomerMetaData))]
public partial class Customer
{ }
public class CustomerMetaData
{
// Apply RequiredAttribute
[Required(ErrorMessage = "Title is required.")]
public object Title;
}

通过使用 MetadataTypeAttribute 属性,您可以将类与数据模型分部类关联。在此关联的类中,您可以提供数据模型中所没有的附加元数据信息。这样较好的区分了,DataBase中类的基本定义与Coding时类的附加性验证,使两张能够结构清晰,分工明确。

[MetadataType(typeof(CompanyMetadata))]
public partial class Company
{
public class CompanyMetadata
{
[JsonIgnore]//防止API调用中的嵌套输出
public virtual ICollection<Advertise> Advertise { get; set; }
}
}
  • rowversion

使用rowversion数据类型实现乐观锁

SQL Server 2008 提供了一个特殊数据类型rowversion,它可以用于在应用程序中实现乐观锁。rowversion数据类型在乐观锁模式下充当版本号。无论何时包含rowversion类型数据列的行被插入或更新时,SQL Server 自动为该列生成一个值。rowversion数据类型是8字节的二进制数据类型,除了保证值的唯一性和单向增长外,它的值不具有意义。你不能够查看它的每个字节来搞懂它是什么意思。

客户端从表中读取数据,确保返回的结果集中包含了主键和rowversion列,以及其他想要的数据列。由于查询并不运行在事务中,一旦数据被读取,SELECT查询获取的锁即被释放。当一段时间过后用户想要更新某行时,必须确保在此期间该数据没有被其他客户端修改过。Update语句必须包含WHERE子句用以比较取回的rowversion值与数据库中该列的当前值。如果两个值匹配(即相同),说明该行记录在此期间没有被修改过。因此可以放心提交更改。如果不匹配,则说明该行记录已经被修改过。为了避免Lost Update问题发生,不应提交本次更新。

  • Linq to SQl 与传统SQl语句的整合

ViewBag.RowsAffected = db.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier); string query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
+ "FROM Person "
+ "WHERE Discriminator = 'Student' "
+ "GROUP BY EnrollmentDate";
IEnumerable<EnrollmentDateGroup> data = db.Database.SqlQuery<EnrollmentDateGroup>(query); IQueryable<Course> courses = db.Courses;
var sql = courses.ToString(); * **延迟,饿汉,以及显式加载关联数据** var departments = context.Departments;
foreach(Department d in departments)
{foreach get course.}
//Lazy Loading当第一次访问关联属性时,关联数据才会被自动读取。 var departments = context.Departments.Include(x=x.Course){foreach,foreach get course}
//Eager Loading 当实体加载时,相关联的数据也一起被加载。性能最好,因为只给Db发送一次查询。 var departments = context.Departments.ToList();
Context.Entry(d).Collection(x=>x.Courses).Load();
//Explict Loading 类似于延迟加载,如果不常访问关联实体属性,或仅访问一小部分,则延迟加载更有效。 数据库上下文默认支持延迟加载,有两种方法可以关闭延迟加载:
对于特定的导航属性,在定义属性的时候取消 virtual
对于所有的导航属性,设置 LazyLoadingEnabled 为假。

源码学习之ASP.NET MVC Application Using Entity Framework的更多相关文章

  1. MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型

    为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By  Tom Dykstra |July 30, 2013 Translated by litdwg   ...

  2. Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1

    这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...

  3. Asp.Net MVC 模型(使用Entity Framework创建模型类)

    这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...

  4. 【源码】进入ASP.NET MVC流程的大门 - UrlRoutingModule

    UrlRoutingModule的功能 在ASP.NET MVC的请求过程中,UrlRoutingModule的作用是拦截当前的请求URL,通过URL来解析出RouteData,为后续的一系列流程提供 ...

  5. 权限管理系统源码分析(ASP.NET MVC 4.0 + easyui + EF6.0 + MYSQL/MSSQLSERVER +微软企业库5.0+日志绶存)

    系统采用最先进技术开发: (ASP.NET MVC 4.0 + easyui + EF6.0 + MYSQL/MSSQLSERVER +微软企业库5.0+日志绶存) 大家可以加我QQ讨论 309159 ...

  6. SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析

    目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...

  7. 源码的说明 ASP.NET MVC 5框架揭秘.zip

    第1章 S101 MVP(SC)模式中Presenter与View之间的交互 S102 迷你版的ASP.NET MVC框架 第2章 S201 通过路由实现请求地址与.aspx页面的映射 S202 基本 ...

  8. asp.net mvc 之旅 —— 第五站 从源码中分析asp.net mvc 中的TempData

    在mvc的controller中,我们知道有很多的临时变量存放数据,比如说viewData,viewBag,还有一个比较特殊的tempData,关于前两个或许大家都明白, 基本上是一个东西,就是各自的 ...

  9. 【Spark2.0源码学习】-8.SparkContext与Application介绍

             在前面的内容,我们针对于RpcEndpoint启动以及RpcEndpoint消息处理机制进行了详细的介绍,在我们的大脑里,基本上可以构建Spark各节点的模样.接下来的章节将会从Sp ...

随机推荐

  1. DW 做一个table表 对单元格进行合并

    编辑前的代码 <body> <table width="500" border="0" bgcolor='#000000' backgroun ...

  2. [Linked List]Rotate List

    Total Accepted: 55428 Total Submissions: 250727 Difficulty: Medium Given a list, rotate the list to ...

  3. css实现两端对齐的3种方法

    两端对齐在移动端非常见,说到两端对齐,大家并不陌生,在word.powerpoint.outlook等界面导航处,其实都有一个两端对齐(分散对齐)的按钮,平时使用的也不多,我们更习惯与左对齐.居中对齐 ...

  4. Looper、Hander、HandlerThread

    一.Message .Looper.Handler之间的关系 1.系统发送的Message消息传送给Handler,Handler将Message放入自己的looper队列的底部   然后再从Loop ...

  5. Oracle ORA-01555 快照过旧 说明

    oracle高级知识(1) ORA-01555 快照过旧,是数据库中很常见的一个错误,比如当我们的事务需要使用undo来构建CR块的时候,而此时对应的undo 已经不存在了, 这个时候就会报ORA-0 ...

  6. sshd服务---暴力破解应对策略

    sshd服务暴力破解步骤 sshd暴力破解方法 防止暴力破解调优 1. 变更默认端口 2. 变更root用户 3. 日志监控-->防止暴力破解(fail2ban应用) fail2ban详解 在初 ...

  7. QueryString和BASE64

    加号(+)是BASE64编码的一部分,而加号在QueryString中被当成是空格.因此,当一个含有BASE64编码的字符串直接作为URL的一部分时,如果其中含有加号,则使用QueryString读取 ...

  8. VS2008下WinRar源码生成dll和 lib总结

    WinRar官方提供了源码(http://www.rarlab.com/rar_add.htm):如果自己想要修改里面的内容就要重新生成DLL和LIB,我在网上找了很多资料都没有说得很清楚.花一两天的 ...

  9. android基础4——Mainifest

    众所周知,应用程序中的每一个UI都是通过Activity类的一个或者多个拓展实现的.在桌面开发环境中,Activity相当于Form,来布局和显示信息,以及影响用户的动作.Mainifest可以定义应 ...

  10. Hibernate 配置详解(9)

    hibernate.cache.use_structured_entries Hibernate文档上介绍,该属性是用于把对象以一种更易读的方式放到二级缓存中,这样,在对二级缓存进行监控的时候就更容易 ...