• HappyGIS 正式上线啦~
    • HappyGIS 现在已经支持 Markdown 格式评论~

## ORM框架之Entity Framework入门学习

C# 张明 1006次浏览 0个评论

1. 基本概念

​ ORM:对象关系映射(Object-Relation-Mapping),主要实现基于面向对象方式操作数据库的各种方法,是一种框架技术。

1.1 ORM提出的原因

​ 长期以来,C#与数据库操作一直以来处于分类状态。即C#最后的操作都要转换成普通的SQL语句,从开发者角度来讲,对于快速开发来讲,效率会有一定的影响。

​ ORM提出来后,这种转换工作,其实有ORM框架本身完成。即通过对象来操作数据。

2. .NET中ORM框架

​ NHibernate、MyBatis、LINQ to SQL、 ADO.NET Entity Framew (现在主流)、以及企业自己的开发框架。

2.1 ORM框架四大法宝:

​ 1、App.config:配置文件(保存应用程序配置文件)

看看配置文件:

```C#
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

<pre><code>```c#
<connectionStrings>
<add name="StudentEntities" connectionString="metadata=res://*/EFDB.csdl|res://*/EFDB.ssdl|res://*/EFDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Student;user id=sa;password=zm19931228;MultipleActiveResultSets=True;App=EntityFramework&quot;"
providerName="System.Data.EntityClient" /></connectionStrings>

​ 大概就是保存应用程序的配置以及连接数据库所需的用户名,密码,数据库名,服务器名等数据保存在配置文件中。
​ 2、EDDB.edmx:EDM元数据文件(整个ORM框架的映射中心,将对象关系型数据库模型(数据表)映射成完全对象化的实体模型)
​ (1.)SSDL:存储模型(描述数据库各个数据表的结构,表名称,列的特征,表之间的关系)

```c#
edmx:StorageModels>
<Schema Namespace="StudentModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2008" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityType Name="infomation">
<Key>
<PropertyRef Name="name" />
</Key>
<Property Name="name" Type="nvarchar" MaxLength="50" Nullable="false" />
<Property Name="age" Type="int" Nullable="false" />
<Property Name="gender" Type="nchar" MaxLength="10" Nullable="false" />
</EntityType>
<EntityContainer Name="StudentModelStoreContainer">
<EntitySet Name="infomation" EntityType="Self.infomation" Schema="dbo" store:Type="Tables" />
</EntityContainer>
</Schema>
</edmx:StorageModels>

<pre><code>​ *:通过SSDL,ORM就能够读懂数据库的数据表
​ (2.)CSDL:实体模型(描述C#的实体类,PS:实体类就是对数据表的映射)

```c#
<edmx:ConceptualModels>
<Schema Namespace="StudentModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="infomation">
<Key>
<PropertyRef Name="name" />
</Key>
<Property Name="name" Type="String" MaxLength="50" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="age" Type="Int32" Nullable="false" />
<Property Name="gender" Type="String" MaxLength="10" FixedLength="true" Unicode="true" Nullable="false" />
</EntityType>
<EntityContainer Name="StudentEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="infomation" EntityType="Self.infomation" />
</EntityContainer>
</Schema>
</edmx:ConceptualModels>

​ *:通过CSDL,ORM就能读懂C#中的实体类
​ (3.)C-S mapping:映 射模型(将(数据表)的描述和(C#)的描述关联,即对应起来))

```c#
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="StudentModelStoreContainer" CdmEntityContainer="StudentEntities">
<EntitySetMapping Name="infomation">
<EntityTypeMapping TypeName="StudentModel.infomation">
<MappingFragment StoreEntitySet="infomation">
<ScalarProperty Name="name" ColumnName="name" />
<ScalarProperty Name="age" ColumnName="age" />
<ScalarProperty Name="gender" ColumnName="gender" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>

<pre><code>​ *:通过C-S mapping,ORM就能够通过实体对象找到对应的数据表,并把实体属性和数据表的列对应准确

### 3. 话不多说直接上代码

```c#
//创建用户信息对象(将来从web页面或Windows窗体穿过来)
//infomation类就是数据库中的infomation表,通过ORM矿建映射为infomation实体类
infomation info1 = new infomation
{
name = "zmgis",
age = 18,
gender = "男"
};
//创建数据库上下文对象
StudentEntities studentEntities = new StudentEntities();
//将实体对象添加到数据库上下文对象集合中
studentEntities.infomation.Add(info1);
//将集合的对象更改保存到数据库中
int res = studentEntities.SaveChanges();
Console.WriteLine(res);
Console.ReadKey();

  • *运行程序在控制台打印出res等于 1,1代表保存成功

打开数据库,在数据库中查看是否保存成功

SELECT TOP 1000 [name]
,[age]
,[gender]
FROM [Student].[dbo].[infomation]

运行查看结果: 发现数据库中有这条记录,操作成功(说明infomation表中原来没有数据,所以查出来的只有我刚导入的数据)

name age gender
zmgis 18 男

从头到脚没写一条sql语句,但数据就轻松写进数据库了,充分体现面向对象的思想,通过操作对象来完成数据的怎删改查。

4.总结

  • 总体理解:有 *.edmx文件,数据库的各个表和C#实体对象彻底关联起来,将来在程序中操作C#实体对象,ORM就知道操作的是那个数据表,以及对应的数据表字段
  • 简化理解*.edmx就是一个数据库和C#对象之间的“翻译官”或“适配器”

5. 附加

5.1数据库上下文对象和实体类的使用

  • 实体类:和普通实体类相比,多了导航属性(PS:导航属性:将数据库各个表之间的关系表现的淋漓尽致,通过导航属性,可以轻松实现)
  • 数据库上下文对象

*首先入门ORM框架,必须对linq 和 委托 有比较好的理解,同时理解适配器设计模式,将会更好的理解ORM框架以及快速入门ORM框架。


HappyGIS 版权所有, 本站文章可随意转载, 请注明出处: 转载请注明## ORM框架之Entity Framework入门学习
喜欢 (1)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址