当前位置: 代码迷 >> .NET Framework >> 尝试 Entity Framework POCO效能与CodeFirst的结合
  详细解决方案

尝试 Entity Framework POCO效能与CodeFirst的结合

热度:221   发布时间:2016-05-01 23:27:30.0
尝试 Entity Framework POCO功能与CodeFirst的结合

Entity Framework 2.0中添加了的支持POCO(Plain Old CLR Object)的功能,这使得EF的功能越来越强大了。下面分享一下我自己摸索学习的一个例子:

一、新建一个项目

新建一个控制台应用程序EFPOCOTest(具体过程不再累述)。

二、添加实体数据模型

1.在控制台应用程序的根目录下右击->添加新项,选择数据->实体数据模型,名称改为Company.edmx,点击添加。在数据模型向导中选择空模型,点击完成。接着会在VS中打开一个数据模型设计器,在空白处右击选择属性,修改代码生成策略为无(为True时EF会为我们自动生成实体类以及EF数据访问上下文网关ObjectContext的代码)。

2.添加实体类、实体类之间的关联、复杂属性。最终效果如下所示。在设计器的空白处右击,选择根据实体模型更新数据库,点击完成,默认情况下已经在VS中打开了,点击右上角的执行按钮,就会执行脚本,最后在数据库中生成两个表。

                          

三、根据设计好的实体编写对应的实体类

分别编写Department类、Wheel类、Car类。属性的名字要跟模型上的属性一样。

(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类

  相关解决方案