Entity Framework 4的特性介绍可看这篇文章 .NET 4中Entity Framework简介,其中最感兴趣的一点就是对POCO的支持了:EF4为实体提供了简单传统CLR对象(Plain Old CLR Object / POCO)支持。您的实体对象可以独立于EF存在,由此EF更好地支持了测试驱动开发(test-driven development)和领域驱动设计(domain-driven design)。同时,EF仍旧可以帮助跟踪POCO实体的变化,允许延迟加载,也会自动修正对导航属性(navigation properties)和外键的改动。
Entity Framework 1.0 发布了很长一段时间了,但感觉用的人很少。其中一个很大的原因,也许就是不支持POCO,至少我自己是这么想而不使用EF1的,Entity Framework 4.0版本(又称EF V2)将提供POCO支持,对很多人来说,这是开始使用Entity Framework的时候了。
学习最好的方式当然是动手练习了,今天花了大半天跟着这篇文章【翻译】在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式,这篇文章里头有3篇POCO的系列,虽然文章是写于EF4 beta1的时候,现在已经是RC,一样有效:
POCO in Entity Framework : Part 1 – The Experience(【翻译】实体框架中的POCO支持 - 第一部分 - 体验 )
POCO in Entity Framework : Part 2 – Complex Types, Deferred Loading and Explicit Loading (【翻译】实体框架中的POCO支持 - 第二部分 - 复杂类型,延迟装载和显式装载 )
POCO in Entity Framework : Part 3 – Change Tracking with POCO (【翻译】实体框架中的POCO支持 - 第三部分 - POCO的变动跟踪)
还有这篇文章EF 4 – Implementing POCO Objects,图文并茂的详细介绍了整个过程。
这里整理一下学习过程中的注意点:
- 自动生成代码的功能要关掉
- 继承的ObjectContext的构造函数的参数其实就是指定数据库连接串Connection String
- 工具生成的Edmx的Connection String的只保存在该程序集的app.config中,记得拷贝到相关的app.config或者web.config
- 因为没有CSDL和SSDL,所以Edmx中的Model上的Table Name和Column Name务必和你的POCO的名称一致。Entity Framework 4.0 引入了基于约定(convention)的映射,以允许不用显式的修饰,就可将实体类型,属性,复杂类型和关系映射到概念性模型。一个简单的规则是,在你的POCO类中使用的实体类型名称,属性名称,和复杂类型名称必须匹配那些在概念性模型中定义了的相应名称。
- 代码的单元测试很重要
- 延迟加载的属性要设置成Virtual, ObjectContext上需要设置 ContextOptions.LazyLoadingEnabled = true
- 对于枚举类型的支持是通过复杂类型来实现的,可以参考文章 http://blogs.msdn.com/alexj/archive/2009/06/05/tip-23-how-to-fake-enums-in-ef-4.aspx
Tip 53 – How to debug EF POCO mapping issues : http://blogs.msdn.com/alexj/archive/2010/02/12/tip-53-how-to-debug-ef-poco-mapping-issues.aspx