尝试 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类

Linq语句不容易编写,想要编写正确的Linq语句可以借助LINQPad工具

源代码: EF 的POCO+CodeFirst设计实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值