源码学习之ASP.NET MVC Application Using Entity Framework
2014-11-17 15:25
756 查看
源码学习的重要性,再一次让人信服。
ASP.NET MVC Application Using Entity Framework Code First
做MVC已经有段时间了,但看了一些CodePlex上的代码,仍然觉得需要学习的东西还很多,基本上功能都可以实现,但如果放弃去利用框架本身已经聚合与提供的便利性功能,那往往会事倍功半,即使实现,也不漂亮不专业,不舒服。
很多专业的东西都在那里,没事瞅瞅,不要动不动一上来就老三样,或者放弃好东西,用自己的老办法去经验性的解决,既然可以实现,那就要去找最漂亮的解决办法,否则何来提升。
虚拟属性
DataType
Custom,
DateTime,
Date,
Time,
Duration,
PhoneNumber,
Currency,
Text,
Html,
MultilineText,
EmailAddress,
Password,
Url,
ImageUrl,
CreditCard,
PostalCode,
Upload,
很多常用的验证都已经被封装好了,只需要用就可以了,不要再费劲的写正则了,亲。
MetadataTypeAttribute
通过使用 MetadataTypeAttribute 属性,您可以将类与数据模型分部类关联。在此关联的类中,您可以提供数据模型中所没有的附加元数据信息。这样较好的区分了,DataBase中类的基本定义与Coding时类的附加性验证,使两张能够结构清晰,分工明确。
rowversion
使用rowversion数据类型实现乐观锁
SQL Server 2008 提供了一个特殊数据类型rowversion,它可以用于在应用程序中实现乐观锁。rowversion数据类型在乐观锁模式下充当版本号。无论何时包含rowversion类型数据列的行被插入或更新时,SQL Server 自动为该列生成一个值。rowversion数据类型是8字节的二进制数据类型,除了保证值的唯一性和单向增长外,它的值不具有意义。你不能够查看它的每个字节来搞懂它是什么意思。
客户端从表中读取数据,确保返回的结果集中包含了主键和rowversion列,以及其他想要的数据列。由于查询并不运行在事务中,一旦数据被读取,SELECT查询获取的锁即被释放。当一段时间过后用户想要更新某行时,必须确保在此期间该数据没有被其他客户端修改过。Update语句必须包含WHERE子句用以比较取回的rowversion值与数据库中该列的当前值。如果两个值匹配(即相同),说明该行记录在此期间没有被修改过。因此可以放心提交更改。如果不匹配,则说明该行记录已经被修改过。为了避免Lost Update问题发生,不应提交本次更新。
Linq to SQl 与传统SQl语句的整合
```
延迟,饿汉,以及显式加载关联数据
//Lazy Loading当第一次访问关联属性时,关联数据才会被自动读取。
//Eager Loading 当实体加载时,相关联的数据也一起被加载。性能最好,因为只给Db发送一次查询。
//Explict Loading 类似于延迟加载,如果不常访问关联实体属性,或仅访问一小部分,则延迟加载更有效。
数据库上下文默认支持延迟加载,有两种方法可以关闭延迟加载:
对于特定的导航属性,在定义属性的时候取消 virtual
对于所有的导航属性,设置 LazyLoadingEnabled 为假。
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 为假。
相关文章推荐
- http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application
- [转]Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application (3 of 10)
- Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application
- 翻译:ASP.NET MVC Example Application over Northwind with Entity Framework
- Using the Repository Pattern with ASP.NET MVC and Entity Framework
- [ASP.NET MVC]Entity Framework框架之CodeFirst模式学习笔记
- [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework
- ASP.NET MVC 3 Framework 学习笔记
- ASP.NET MVC 3 (Entity Framework Code-First Development) (4/9)
- Integrating OpenID in an ASP.NET MVC Application using DotNetOpenAuth
- EFMVC - ASP.NET MVC 3 and Entity Framework 4.1 Code First 项目介绍
- 《Pro ASP.NET MVC 3 Framework》学习笔记之二十七【视图1】
- Asp.Net Entity Framework 学习指南
- Using StructureMap with the ASP.NET MVC framework
- 《Pro ASP.NET MVC 3 Framework》学习笔记之二十二【Controllers和Actions】
- 微软项目技术结构思路 ExtJs/JQuery + Asp.net MVC + Wcf service + Entity Framework
- ASP.NET MVC+Entity Framework 4.1访问数据库
- MVC architecture in ASP.Net using C# and Microsoft Data Access Application block
- 《Pro ASP.NET MVC 3 Framework》学习笔记之六【C#部分特性】
- 《Pro ASP.NET MVC 3 Framework》学习笔记之二十五