ADO .NET Entity Framework是对象-关系映射架构,提供ORM的功能。

首先我们在SQL Server中添加一个表

CREATE TABLE [dbo].[Student](
	[Uid] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](20) NOT NULL,
	[TeaUid] [int] NOT NULL,
	[Notes] [varchar](100) NULL,
	[age] [int] NULL
)

随便插入一点数据

sql server如何建立dblink sql server如何建立映射表_xml

然后我们在visual stdio 中创建一个Console.工程

sql server如何建立dblink sql server如何建立映射表_Data_02

sql server如何建立dblink sql server如何建立映射表_Data_03

这里需要选择Framework的工程,因为Core工程还需要自己额外的导入包,Framework已经集成好了。

sql server如何建立dblink sql server如何建立映射表_Data_04

然后我们的项目就创建好了。

sql server如何建立dblink sql server如何建立映射表_microsoft_05

一个非常普通的Console项目。

接下来我们来创建数据库映射。

sql server如何建立dblink sql server如何建立映射表_Data_06

右键点击工程名--->左键点击Add--->左键New item

sql server如何建立dblink sql server如何建立映射表_microsoft_07

在出来的画面上选择Data下的ADO .NET Data Model,取名为testModel

sql server如何建立dblink sql server如何建立映射表_microsoft_08

选择好EF Designer from data 这样就可以生成EF模块

sql server如何建立dblink sql server如何建立映射表_xml_09

然后到了这个界面,这个界面就是要去链接你的数据库,所以我们需要提供我们数据库的链接信息。

点击New connection表示创建一个新的链接

sql server如何建立dblink sql server如何建立映射表_microsoft_10

Data source是你要链接的数据库类型,如mysql,sql server之类的

其中server name为服务名,一般就是你sql server的链接名,如下图所示

sql server如何建立dblink sql server如何建立映射表_Data_11

然后就是选择身份验证,输入你的账号密码。

如果链接成功,点击select or enter a database name 是可以看见这个连接下的数据库的。

这里我们把刚才的创建表的test数据库连接上。 

这时会返回到上一个界面,我们已经确定了链接

sql server如何建立dblink sql server如何建立映射表_microsoft_12

sql server如何建立dblink sql server如何建立映射表_Data_13

这里会生成链接信息,勾选了checkBox后会生成链接对象。

点击next,选择版本。

点击next

sql server如何建立dblink sql server如何建立映射表_microsoft_14

把tables勾选上,因为我们动了表,点击完成。稍等一会儿。

sql server如何建立dblink sql server如何建立映射表_Data_15

发现多出了模块。

我们可以先打开App.config 

<connectionStrings>
    <add name="testEntities" connectionString="metadata=res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl;provider=System.Data.SqlClient;provider connection string="data source=XA-LSR-WINSTON;initial catalog=test;user id=sa;password=63271202hzy!;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
  </connectionStrings>

发现我们的链接信息已经写进去了。并且名字叫做testEntites,这就表示连接对象。

双击新模块的testModel.edmx文件

sql server如何建立dblink sql server如何建立映射表_microsoft_16

vs会给我们显示表结构,图形化看的不是很清楚,我们右键点击edmx-->open with用xml形式打开这个文件。

sql server如何建立dblink sql server如何建立映射表_xml_17

这是会出现一个非常多的xml文件

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="testModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" 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="Student">
          <Key>
            <PropertyRef Name="Uid" />
          </Key>
          <Property Name="Uid" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
          <Property Name="Name" Type="varchar" MaxLength="20" Nullable="false" />
          <Property Name="TeaUid" Type="int" Nullable="false" />
          <Property Name="Notes" Type="varchar" MaxLength="100" />
          <Property Name="age" Type="int" />
        </EntityType>
        <EntityContainer Name="testModelStoreContainer">
          <EntitySet Name="Student" EntityType="Self.Student" Schema="dbo" store:Type="Tables" />
        </EntityContainer>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="testModel" 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="Student">
          <Key>
            <PropertyRef Name="Uid" />
          </Key>
          <Property Name="Uid" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
          <Property Name="Name" Type="String" MaxLength="20" FixedLength="false" Unicode="false" Nullable="false" />
          <Property Name="TeaUid" Type="Int32" Nullable="false" />
          <Property Name="Notes" Type="String" MaxLength="100" FixedLength="false" Unicode="false" />
          <Property Name="age" Type="Int32" />
        </EntityType>
        <EntityContainer Name="testEntities" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="Students" EntityType="Self.Student" />
        </EntityContainer>
      </Schema>
    </edmx:ConceptualModels>
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="testModelStoreContainer" CdmEntityContainer="testEntities">
          <EntitySetMapping Name="Students">
            <EntityTypeMapping TypeName="testModel.Student">
              <MappingFragment StoreEntitySet="Student">
                <ScalarProperty Name="Uid" ColumnName="Uid" />
                <ScalarProperty Name="Name" ColumnName="Name" />
                <ScalarProperty Name="TeaUid" ColumnName="TeaUid" />
                <ScalarProperty Name="Notes" ColumnName="Notes" />
                <ScalarProperty Name="age" ColumnName="age" />
              </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/2009/11/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="true" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="true" />
        <DesignerProperty Name="UseLegacyProvider" Value="false" />
        <DesignerProperty Name="CodeGenerationStrategy" Value="None" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams></Diagrams>
  </Designer>
</edmx:Edmx>

我们发现分为SSDL CSDL MSL三个部分

SSDL 是逻辑层 也就是数据库的表的元信息

<Property Name="Uid" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
          <Property Name="Name" Type="varchar" MaxLength="20" Nullable="false" />

看字段的类型是和数据库一致的。

那么CSDL自然是C#的对象模型的元信息了。

<Property Name="Uid" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
          <Property Name="Name" Type="String" MaxLength="20" FixedLength="false" Unicode="false" Nullable="false" />

这里就会和生成的对象保持一致。

MSL自然就是映射关系了。

<EntityContainerMapping StorageEntityContainer="testModelStoreContainer" CdmEntityContainer="testEntities">
          <EntitySetMapping Name="Students">
            <EntityTypeMapping TypeName="testModel.Student">
              <MappingFragment StoreEntitySet="Student">
                <ScalarProperty Name="Uid" ColumnName="Uid" />
                <ScalarProperty Name="Name" ColumnName="Name" />
                <ScalarProperty Name="TeaUid" ColumnName="TeaUid" />
                <ScalarProperty Name="Notes" ColumnName="Notes" />
                <ScalarProperty Name="age" ColumnName="age" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>

这样就写好了对象关系映射。

我们自己有了这些元信息后通过C#提供的数据库访问接口也是可以实现ORM的,只需要把数据库读到的信息通过注入的方式注入到对象中即可,这就需要用到ADO .NET技术了,最终还是需要通过SQL来完成数据库数据的读取,ORM只是帮我们把对象翻译成了SQL或者是把sqlserver返回结果翻译成了对象。

然后我们就可以用了,在Program.cs的Main方法中写下如下代码

class Program
    {
        static void Main(string[] args)
        {
            using (var data = new testEntities())
            {
                var students = from r in data.Students
                              select r;
                foreach (Student student in students)
                {
                    Console.WriteLine("{0} {1} {2}",student.Uid,student.Name,student.age);
                }
            }
            Console.ReadLine();
        }
    }

以下是运行结果

sql server如何建立dblink sql server如何建立映射表_xml_18

testEntities这个对象有点陌生,我们刚才只是在App.config中看到了name是它,为何成为了一个对象呢?

sql server如何建立dblink sql server如何建立映射表_microsoft_19

我们打开下面这个cs文件

namespace EFPartice
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    
    public partial class testEntities : DbContext
    {
        public testEntities()
            : base("name=testEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<Student> Students { get; set; }
    }
}

发现visual stdio已经给我们生成好了这个对象,DbSet中放着我们的Student对象,并且继承了DbContext对象,添加了构造函数来传递我们的连接元信息。我们在写一些代码

class Program
    {
        static void Main(string[] args)
        {
            using (testEntities data = new testEntities())
            {
                DbSet<Student> students =  data.Students;
                foreach (Student student in students)
                {
                    Console.WriteLine("{0} {1}",student.Uid,student.Name);
                }

            }
            Console.ReadLine();
        }
    }

sql server如何建立dblink sql server如何建立映射表_microsoft_20