Entity Framework快速入门--CodeOnly POCO
2011-02-22 21:38
405 查看
前几篇文章我简单介绍了Entity Framework的概念以及介绍了Database First方式实例和Model First方式实例。今天我们将介绍另外一种令人兴奋的开发方式:CodeOnly!当然EF对于POCO(Plain Old CLR Object)的支持是EF4.0中的一大特性。也是EF可扩展性提高的一大进步。废话少说,也是简单给大家演示一下操作的步骤!先简单说一下流程,然后再看下面的截图!
流程:在EDMX设计器里设计 实体模型→根据实体编写相应的实体类代码→编写数据库访问接口网关→测试结果
那开始我们的EF POCO的旅行吧!
第一步:创建项目
第二步:设计实体模型
在项目上右击 添加新建项目 添加Ado.Net实体数据模型,选择通过空模型来创建。在实体模型设计器中,右击 属性设置实体模型的代码生成策略 :无,这一步的设置是为了不让EF自动帮我们生成实体类代码等,而是由我们自己来定义实体类的代码,这样灵活性更高,而且我们可以在实体类上做扩张更方便,可维护性也更高。设置如下图所示:
然后添加如下两个实体,如下图所示:
在这简单说明一下,两个实体之间有个一对多的关系,这个只需要我们在实体模型设计器中添加关联就可以了。
这一步做好之后,我们还是通过模型来生成数据库!【这里就不多说了,可以参考前面的文章】
第三步:根据设计好的实体编写对应的实体类
分别编写Department类、Car类。属性的名字要跟模型上的属性一样。
Department类 代码如下:
Car类代码如下:
注意:绿色部分是跟其他代码有点区别,因为存在两个表的一(department)对多(car)的关系,所以在设计这个实体类的时候,car只能有一个Department对象的属性,而Department应该有一个car集合对象的属性。
另外就是实体类可以分别放置到其他的Assembly中,并不限制放置于EDMX的项目中!这个特性也是非常令人兴奋的!
第四步:创建数据库访问的网关
添加单独的数据库访问网关的类代码文件,添加如下代码:
其实上面这段代码很简单,就是定义了一个继承ObjectContext的类,在此类中加了car和department实体的ObjectSet的集合。
这样我们所有的准备工作就作为了,下面就是来测试一下你的CodeOnly的结果...
第五步:测试你的成果
[/b]
最终运行正确!
总结一下:
我们并没有用EF自动生成的代码,只是使用了它的模型设计器,帮我们生成CSDL/MSL/SSDL的定义文件(xml).然后我们自己写实体类的代码,以及自己写一个数据库访问的网关ObjectContext!这样带给我们的惊喜是里程碑式的,我们可以在实体类上进行扩展,可以把它扩展成领域模型,而且代码更加灵活,并不受制于EF的自动生成!因为大家都知道,EF自动生成的代码有个弊端,首先就是不灵活,再有就是你在上面就行修改后,再用模型更新一下,就会把修改冲刷掉!这是很头痛的问题,但是有了POCO的支持,我们可以对实体类进行任意的扩展,以及对现有资源的整理,而且为后面的升级维护也提供了基础!
流程:在EDMX设计器里设计 实体模型→根据实体编写相应的实体类代码→编写数据库访问接口网关→测试结果
那开始我们的EF POCO的旅行吧!
第一步:创建项目
第二步:设计实体模型
在项目上右击 添加新建项目 添加Ado.Net实体数据模型,选择通过空模型来创建。在实体模型设计器中,右击 属性设置实体模型的代码生成策略 :无,这一步的设置是为了不让EF自动帮我们生成实体类代码等,而是由我们自己来定义实体类的代码,这样灵活性更高,而且我们可以在实体类上做扩张更方便,可维护性也更高。设置如下图所示:
然后添加如下两个实体,如下图所示:
在这简单说明一下,两个实体之间有个一对多的关系,这个只需要我们在实体模型设计器中添加关联就可以了。
这一步做好之后,我们还是通过模型来生成数据库!【这里就不多说了,可以参考前面的文章】
第三步:根据设计好的实体编写对应的实体类
分别编写Department类、Car类。属性的名字要跟模型上的属性一样。
Department类 代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EFPoco { public class Department { public int ID { get; set; } public string Name { get; set; } public string Master { get; set; } public IList<Car> Car { get; set; } } }
Car类代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EFPoco { public class Car { public int ID { get; set; } public string Name { get; set; } public int DepartmentID { get; set; } public string Size { get; set; } public Department Department { get; set; }//对应的外键关系 } }
注意:绿色部分是跟其他代码有点区别,因为存在两个表的一(department)对多(car)的关系,所以在设计这个实体类的时候,car只能有一个Department对象的属性,而Department应该有一个car集合对象的属性。
另外就是实体类可以分别放置到其他的Assembly中,并不限制放置于EDMX的项目中!这个特性也是非常令人兴奋的!
第四步:创建数据库访问的网关
添加单独的数据库访问网关的类代码文件,添加如下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Objects; namespace EFPoco { public class CompanyContext : ObjectContext { //EF生成的连接字符串 private static string constr = System.Configuration.ConfigurationManager.ConnectionStrings["CompanyContainer"].ConnectionString; public CompanyContext() : base(constr, "CompanyContainer")//第一个参数是EF的链接字符串的Value,第二个是实体容器的名称,可以在实体设计器模型上右击属性里面找到,默认连接字符串的KEY也是容器的名字 { departmentSet = CreateObjectSet<Department>(); carSet = CreateObjectSet<Car>(); } private ObjectSet<Department> departmentSet;//定义Department表对应的ObjectSet的集合 public ObjectSet<Department> DepartmentSet { get { return departmentSet; } set { departmentSet = value; } } private ObjectSet<Car> carSet;//定义Car表对应的ObjectSet的集合 public ObjectSet<Car> CarSet { get { return carSet; } set { carSet = value; } } } }
其实上面这段代码很简单,就是定义了一个继承ObjectContext的类,在此类中加了car和department实体的ObjectSet的集合。
这样我们所有的准备工作就作为了,下面就是来测试一下你的CodeOnly的结果...
第五步:测试你的成果
[b]using(CompanyContext cc =new CompanyContext()) { var result = from c in cc.CarSet select c; foreach (var m in cc.CarSet) { Console.WriteLine( string.Format("name:{0}| size:{1}\r\n", m.Name,m.Size); } }
[/b]
最终运行正确!
总结一下:
我们并没有用EF自动生成的代码,只是使用了它的模型设计器,帮我们生成CSDL/MSL/SSDL的定义文件(xml).然后我们自己写实体类的代码,以及自己写一个数据库访问的网关ObjectContext!这样带给我们的惊喜是里程碑式的,我们可以在实体类上进行扩展,可以把它扩展成领域模型,而且代码更加灵活,并不受制于EF的自动生成!因为大家都知道,EF自动生成的代码有个弊端,首先就是不灵活,再有就是你在上面就行修改后,再用模型更新一下,就会把修改冲刷掉!这是很头痛的问题,但是有了POCO的支持,我们可以对实体类进行任意的扩展,以及对现有资源的整理,而且为后面的升级维护也提供了基础!
Entity Framework快速入门--索引贴
相关文章推荐
- Entity Framework快速入门--CodeOnly POCO【转载】
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
- 【基础练习】【快速幂】codevs3500 快速幂入门题解
- Codevs_P3500 快速幂入门
- [codevs3500] 快速幂入门
- [ORM] Entity Framework(1) CodeFirst快速入门
- 自动化部署服务——AWS CodeDeploy 快速入门
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
- Visual Studio Code中文文档(一)-快速入门
- .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序
- .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序
- Visual Studio Code中文文档(一)-快速入门
- EFCodeFirst快速搭建入门
- CppUnit快速入门
- 快速入门:十分钟学会Python
- .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程
- MyBatis学习总结(一)——MyBatis快速入门
- 正则表达式快速入门
- 容器和算法2 - C++快速入门48(完)
- EJS模版快速入门