Entity Framework快速入门--CodeOnly POCO

简介: 前几篇文章我简单介绍了Entity Framework的概念以及介绍了Database First方式实例和Model First方式实例。今天我们将介绍另外一种令人兴奋的开发方式:CodeOnly!当然EF对于POCO(Plain Old CLR Object)的支持是EF4.0中的一大特性。

前几篇文章我简单介绍了Entity Framework的概念以及介绍了Database First方式实例和Model First方式实例。今天我们将介绍另外一种令人兴奋的开发方式:CodeOnly!当然EF对于POCO(Plain Old CLR Object)的支持是EF4.0中的一大特性。也是EF可扩展性提高的一大进步。废话少说,也是简单给大家演示一下操作的步骤!先简单说一下流程,然后再看下面的截图!

流程:在EDMX设计器里设计 实体模型→根据实体编写相应的实体类代码→编写数据库访问接口网关→测试结果

那开始我们的EF POCO的旅行吧!

第一步:创建项目

第二步:设计实体模型

在项目上右击 添加新建项目 添加Ado.Net实体数据模型,选择通过空模型来创建。在实体模型设计器中,右击 属性设置实体模型的代码生成策略 :无,这一步的设置是为了不让EF自动帮我们生成实体类代码等,而是由我们自己来定义实体类的代码,这样灵活性更高,而且我们可以在实体类上做扩张更方便,可维护性也更高。设置如下图所示:

img_8e4caaaf4fb18eb3c1b9ea5d43cd35ac.png

然后添加如下两个实体,如下图所示:

img_7e3382877d66a880ed845b6b29008bd8.png

在这简单说明一下,两个实体之间有个一对多的关系,这个只需要我们在实体模型设计器中添加关联就可以了。

这一步做好之后,我们还是通过模型来生成数据库!【这里就不多说了,可以参考前面的文章】

第三步:根据设计好的实体编写对应的实体类

分别编写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的结果...

第五步:测试你的成果

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);
}
}

最终运行正确!

总结一下:

我们并没有用EF自动生成的代码,只是使用了它的模型设计器,帮我们生成CSDL/MSL/SSDL的定义文件(xml).然后我们自己写实体类的代码,以及自己写一个数据库访问的网关ObjectContext!这样带给我们的惊喜是里程碑式的,我们可以在实体类上进行扩展,可以把它扩展成领域模型,而且代码更加灵活,并不受制于EF的自动生成!因为大家都知道,EF自动生成的代码有个弊端,首先就是不灵活,再有就是你在上面就行修改后,再用模型更新一下,就会把修改冲刷掉!这是很头痛的问题,但是有了POCO的支持,我们可以对实体类进行任意的扩展,以及对现有资源的整理,而且为后面的升级维护也提供了基础!

 

Entity Framework快速入门--索引贴

目录
相关文章
|
Linux 虚拟化
VMware workstation 中centos7虚拟机在nat模式下怎么配置网卡,指定我想要的IP并且可以联网
https://blog.csdn.net/2302_78534730/article/details/132825156?spm=1001.2014.3001.5502
847 0
|
10月前
|
计算机视觉
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
2222 10
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
|
机器学习/深度学习 人工智能 自然语言处理
人工智能:技术革命与未来展望
人工智能:技术革命与未来展望
|
存储 开发框架 前端开发
ABP VNext框架基础知识介绍(1)--框架基础类继承关系
ABP VNext框架基础知识介绍(1)--框架基础类继承关系
|
安全 Java 应用服务中间件
Tomcat启动闪退问题解决方法
Tomcat启动闪退问题解决方法
295 0
|
算法 安全 物联网
CFCA证书——基于SM2/3算法的安全信任
CFCA证书——基于SM2/3算法的安全信任
560 0
CFCA证书——基于SM2/3算法的安全信任
|
机器学习/深度学习 算法 Python
【Python机器学习】Sklearn库中Kmeans类、超参数K值确定、特征归一化的讲解(图文解释)
【Python机器学习】Sklearn库中Kmeans类、超参数K值确定、特征归一化的讲解(图文解释)
846 0
工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(下)(2)
在上一篇文章中,我们介绍了 ABAP 的查询语句关键的三个部分: 1.SELECT result 部分 2.FROM source 部分 3.INTO target 部分
工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(下)(2)
|
数据安全/隐私保护
微信支付系列之——统一下单
微信支付系列之——统一下单
522 2
|
缓存 Java 数据库
SpringBoot2.x系列教程40--SpringBoot中默认的缓存实现方案
前言 在上一节中,壹哥 带大家学习了Spring Boot中提供的缓存实现方案,尤其是Spring Cache这种实现方案,接下来在本章节中,我将带大家通过代码来具体实现缓存功能。 一. Spring Boot实现默认缓存 1. 创建Web项目 我们按照之前的经验,创建一个SpringBoot的Web程序,具体过程略。 2. 添加依赖包 在pom.xml文件中添加如下核心依赖包。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</
671 0