在我们开始学习之前,回忆一下,我们之前需要操作数据库表中的数据应该如何做?我们是不是得定义表对应的实体类,当开发人员操作实体类后想要把这个变化更新到数据库中是不是还得编写Sql语句。如果项目不大,这也不是什么问题,可万一是个大项目呢?难道我们还得这样?这个时候你可能要说了,我们可以使用一种叫做动软代码生成器的东东进行操作啊,不错,我们有时候确实可以使用这个东东来完成一部分工作量。注意,这里说的是一部分,而且该东东也并没有把上面的两项内容实现很好的封装。那么,是不是有更好的方法呢?
这个时候该ORM上场了,ORM的中文意思是对象关系映射。
先来总体阐述一下ORM主要用来干什么的:跟踪表实体的变化,生成sql脚本,将变化更新到数据库表中去。
O是Object的简写、R是Relation简写、M是Mapping简写。我们所使用的实体就是Object对象,而现在的数据库大多是关系型的数据库。采用此思想,上面的问题迎刃而解。
那么既然是一种很好的思想,微软肯定是不会错过了,于是有了Ado.net EF,它是微软的一个重型的ORM框架,EF是Entity FrameWork的简写。
这个时候你可能就有疑惑了,微软的这个ORM框架有什么好处呢?与我们之前使用的Ado.Net的关系又是什么呢?性能怎么样呢?
不急,咱们一个一个的来解决。
微软的这个ORM框架有什么好处呢?
(1)首先,微软的这个ORM框架解决了题目开始遇到的问题,大大提高了我们开发的效率。
(2)其次,此ORM框架是可以跨数据的,具体操作是通过修改配置文件完成的(以后会具体介绍)。
可能还有其他优点,不过,本人知道的就这么多。
Ado.net EF与Ado.Net的关系又是什么呢?
(1)简单观察一下就可以知道,EF是建立在ado.net框架之上的,在基础点说是建立在.net平台之上的。所以说现在的EF还是不能跨平台的,只能运行在.net平台之上,希望以后能实现跨平台。
(2)ado.net内部提供了一系列与数据库操作相关的类,最终的执行还是得通过sql语句执行实现效果;EF也是如此,他也最终得生成sql语句实现数据库数据的同步更新。
最后,EF的性能怎么样呢?
相对于ado.net来说,性能肯定是不行的,因为它比ado.net多了一个根据映射关系生成sql脚本的过程。但总体来说,EF的性能还是不错的。(PS:本人并未实际测试过,只是一直听其他人这么说的。)
好,既然连微软都与时俱进,作为开发人员,我们也不能落后,今天就好好学习一下这个EF。EF的学习可能有好几个系列,我会在这些系列中记录一些自己的学习心得和碰到的困惑,欢迎各位指导、共同学习。
EF作为微软的一个ORM框架,有三种设计模式DBFirst(先设计数据库)、CodeFirst(最牛X)、ModelFirst(先设计实体),作为初学者,我们还是先做个简单点的DBFirst,具体如下。如果哪里写的不对,欢迎各位高手拍砖指教。
新建数据库EFDBfirst(具体操作过程不再累述),新建一个表Student1
新建一个EFDBFirst项目。在项目的根目录上右击,选择添加新项->实体数据模型,更改文件名为DBFrist(这个就是最重要的上下文),点击确定
弹出的窗体中有从数据库生成和空模型两种,由于我们是DBFirst,选择第一个,选择下一步(第二种空模型会在下面的系列中介绍)
如果下拉列表中不存在,选择新建连接,如下所示,具体操作步骤不再累述。
数据库对象有三种:表、存储过程、视图。我们在此选择Student1表。可以根据需要修改模型命名空间,点击确定。至此,实体数据模型创建成功。
双击打开数据模型文件可以看到实体类中的属性是与数据库中Student1表中的各个字段一一对应的。右击数据模型,选择打开方式->XML(选择打开方式之前需要先把之前打开的数据模型文件关闭),具体文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx"> <!-- EF Runtime content --> <edmx:Runtime> <!-- SSDL content --> <edmx:StorageModels> <Schema Namespace="DemoModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> <EntityContainer Name="DemoModelStoreContainer"> <EntitySet Name="Student1" EntityType="DemoModel.Store.Student1" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="Student1"> <Key> <PropertyRef Name="Sno" /> </Key> <Property Name="Sno" Type="varchar" Nullable="false" MaxLength="10" /> <Property Name="Sname" Type="varchar" Nullable="false" MaxLength="4" /> <Property Name="Ssex" Type="int" Nullable="false" /> <Property Name="Saddress" Type="varchar" Nullable="false" MaxLength="50" /> <Property Name="Sphone" Type="varchar" Nullable="false" MaxLength="11" /> </EntityType> </Schema> </edmx:StorageModels> <!-- CSDL content --> <edmx:ConceptualModels> <Schema Namespace="DemoModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm"> <EntityContainer Name="DemoEntities1" annotation:LazyLoadingEnabled="true"> <EntitySet Name="Student1" EntityType="DemoModel.Student1" /> </EntityContainer> <EntityType Name="Student1"> <Key> <PropertyRef Name="Sno" /> </Key> <Property Name="Sno" Type="String" Nullable="false" MaxLength="10" Unicode="false" FixedLength="false" /> <Property Name="Sname" Type="String" Nullable="false" MaxLength="4" Unicode="false" FixedLength="false" /> <Property Name="Ssex" Type="Int32" Nullable="false" /> <Property Name="Saddress" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" /> <Property Name="Sphone" Type="String" Nullable="false" MaxLength="11" Unicode="false" FixedLength="false" /> </EntityType> </Schema> </edmx:ConceptualModels> <!-- C-S mapping content --> <edmx:Mappings> <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="DemoModelStoreContainer" CdmEntityContainer="DemoEntities1"> <EntitySetMapping Name="Student1"><EntityTypeMapping TypeName="DemoModel.Student1"><MappingFragment StoreEntitySet="Student1"> <ScalarProperty Name="Sno" ColumnName="Sno" /> <ScalarProperty Name="Sname" ColumnName="Sname" /> <ScalarProperty Name="Ssex" ColumnName="Ssex" /> <ScalarProperty Name="Saddress" ColumnName="Saddress" /> <ScalarProperty Name="Sphone" ColumnName="Sphone" /> </MappingFragment></EntityTypeMapping></EntitySetMapping> </EntityContainerMapping> </Mapping> </edmx:Mappings> </edmx:Runtime> <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) --> <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx"> <Connection> <DesignerInfoPropertySet> <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" /> </DesignerInfoPropertySet> </Connection> <Options> <DesignerInfoPropertySet> <DesignerProperty Name="ValidateOnBuild" Value="true" /> <DesignerProperty Name="EnablePluralization" Value="False" /> <DesignerProperty Name="IncludeForeignKeysInModel" Value="True" /> </DesignerInfoPropertySet> </Options> <!-- Diagram content (shape and connector positions) --> <Diagrams> <Diagram Name="Model1"> <EntityTypeShape EntityType="DemoModel.Student1" Width="1.5" PointX="0.75" PointY="0.75" Height="1.9700325520833331" IsExpanded="true" /> </Diagram> </Diagrams> </Designer> </edmx:Edmx>
关于XML 文件内的各种内容不在累述,具体可参考我的另一篇博文:实体数据模型的XML文件。
DBFirst实例操作到此完毕,下一篇将会讲述使用DBFirst进行一个具体小项目的设计,欢迎各位指导并给出建设性意见!