码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-21 15:11:07      阅读:381      评论:0      收藏:0      [点我收藏+]

标签:尝试 entity framework   codefirst   poco   

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类

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

标签:尝试 entity framework   codefirst   poco   

原文地址:http://blog.csdn.net/ydm19891101/article/details/42968641

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!