Entity Framework 2.0中添加了的支持POCO(Plain Old CLR Object)的功能,这使得EF的功能越来越强大了。下面分享一下我自己摸索学习的一个例子:
一、新建一个项目
新建一个控制台应用程序EFPOCOTest(具体过程不再累述)。
二、添加实体数据模型
1.在控制台应用程序的根目录下右击->添加新项,选择数据->实体数据模型,名称改为Company.edmx,点击添加。在数据模型向导中选择空模型,点击完成。接着会在VS中打开一个数据模型设计器,在空白处右击选择属性,修改代码生成策略为无(为True时EF会为我们自动生成实体类以及EF数据访问上下文网关ObjectContext的代码)。
2.添加实体类、实体类之间的关联、复杂属性。最终效果如下所示。在设计器的空白处右击,选择根据实体模型更新数据库,点击完成,默认情况下已经在VS中打开了,点击右上角的执行按钮,就会执行脚本,最后在数据库中生成两个表。
三、根据设计好的实体编写对应的实体类
(1)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; } public Wheel Wheel { get; set; } }}
(2)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; } }}
(3)Wheel类
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace EFPoco{ public class Wheel { public int ID { get; set; } public string Name { get; set; } public string Size { get; set; } public string Remark { get; set; } }}
(4)CompanyContext 类
CompanyContext继承了基类ObjectContext。它是封装了访问数据库的网管,所有的增删查改都通过此接口对数据库进行操作
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("name=CompanyContainer", "CompanyContainer") { department = CreateObjectSet<Department>(); car = CreateObjectSet<Car>(); } private ObjectSet<Department> department;//定义Department表对应的ObjectSet的集合 public ObjectSet<Department> Department { get { return department; } set { department = value; } } private ObjectSet<Car> car;//定义Car表对应的ObjectSet的集合 public ObjectSet<Car> Car { get { return car; } set { car = value; } } }}
四、窗体设计
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace EFPoco{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { using (CompanyContext cc = new CompanyContext()) { var result = from c in cc.Car select c; this.dataGridView1.DataSource = result.AsEnumerable<Car>(); foreach (var m in cc.Car) { this.richTextBox1.Text += string.Format("name:{0}| size:{1}\r\n", m.Wheel.Name, m.Wheel.Size); } } } }}
五、测试
测试成功
五、总结
EF的三种设计模式:DBFirst、ModelFirst、CodeFirst。有关前两种设计模式的区别请参考我的另一篇博文:ModelFirst ,DBFirst两种设计模型的区别和两种更新的区别 。后两种设计模式差不多(代码生成策略设计不同),都是根据实体模型生成对应的数据库。初学EF,在该实例设计中遇到了以下问题,希望大家可以引以为戒,避免再次出现
(1)代码生成策略忘记修改,不修改是ModelFirst、修改为无是CodeFirst
(2)实体类对应的属性与数据库不一致(因为需要手敲,不细心的话会出错误)
(3)实体模型上下文中的连接字符串配置错误(实体容器等概念不清楚导致)
(4)Wheel是一个复杂的数据类型,应该先创建Wheel类,再创建Car类