Entity Framework使用DataBase First模式实现增删改查

一、新建控制台应用程序,然后右键->添加新建项,选择数据里面的实体数据模型:

然后点击添加

二、选择来自数据库的EF设计器,并点击下一步

三、在实体数据模型向导界面选择要使用的数据连接,或者点击新建连接按钮创建新的连接,这里选择已有的连接,并点击下一步:

四、选择实体框架6.0,点击下一步:

五、选择要操作的表,并点击完成:

六、查看生成的项目结构

自动添加了EntityFramework的引用。同时会在项目的根目录下面生成一个package文件夹:

package文件夹里面存放的是与EntityFramework有关的文件:

查看生成的配置文件:

ConfigSections节点里面有一个section段的name为entityFramework,下面有一个节点的名称就是该section段name的值。如果想在其他地方使用EF的配置信息,那么需要把configSections、connectionStrings、entityFramework三个节点都需要拷贝过去,并且configSections节点是在所有节点的最前面。

七、查看生成的edmx文件

1、查看.tt下面的文件

.tt文件下面生成的就是数据库表对应的实体类,并且是但是形式的。

2、查看.edmx文件

在edmx文件上面右键选择打开方式,选择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="StudentSystemModel.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="StudentID" />
          </Key>
          <Property Name="StudentID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
          <Property Name="StudentName" Type="varchar" MaxLength="16" />
          <Property Name="Sex" Type="varchar" MaxLength="8" />
          <Property Name="Age" Type="int" />
          <Property Name="Major" Type="varchar" MaxLength="32" />
          <Property Name="Email" Type="varchar" MaxLength="32" />
        </EntityType>
        <EntityContainer Name="StudentSystemModelStoreContainer">
          <EntitySet Name="Student" EntityType="Self.Student" Schema="dbo" store:Type="Tables" />
        </EntityContainer>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="StudentSystemModel" 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="StudentID" />
          </Key>
          <Property Name="StudentID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
          <Property Name="StudentName" Type="String" MaxLength="16" FixedLength="false" Unicode="false" />
          <Property Name="Sex" Type="String" MaxLength="8" FixedLength="false" Unicode="false" />
          <Property Name="Age" Type="Int32" />
          <Property Name="Major" Type="String" MaxLength="32" FixedLength="false" Unicode="false" />
          <Property Name="Email" Type="String" MaxLength="32" FixedLength="false" Unicode="false" />
        </EntityType>
        <EntityContainer Name="StudentSystemEntities" 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="StudentSystemModelStoreContainer" CdmEntityContainer="StudentSystemEntities">
          <EntitySetMapping Name="Students">
            <EntityTypeMapping TypeName="StudentSystemModel.Student">
              <MappingFragment StoreEntitySet="Student">
                <ScalarProperty Name="StudentID" ColumnName="StudentID" />
                <ScalarProperty Name="StudentName" ColumnName="StudentName" />
                <ScalarProperty Name="Sex" ColumnName="Sex" />
                <ScalarProperty Name="Age" ColumnName="Age" />
                <ScalarProperty Name="Major" ColumnName="Major" />
                <ScalarProperty Name="Email" ColumnName="Email" />
              </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="无" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams></Diagrams>
  </Designer>
</edmx:Edmx>

其中SSDL content定义的是数据库表的结构:

CSDL content定义的是实体类的结构:

C-S mapping content定义的是实体类和数据库表的映射关系:

从C-S mapping content节点中可以看出,EF为什么会自动生成实体类,或者通过实体类为什么能操作数据库的数据了。

从这里可以看出EF做的第一件事情:取数据库的数据表结构,生成实体类,在表和实体之间自动建立映射关系。

3、StudentManager.tt是T4模板,是用来生成实体类的模板。

T4模板:从edmx中取数据结构,按照模板生成对应格式的实体类。

4、StudentManager.Context.cs文件

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码已从模板生成。
//
//     手动更改此文件可能导致应用程序出现意外的行为。
//     如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------

namespace EFDbFirstDemo
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class StudentSystemEntities : DbContext
    {
        public StudentSystemEntities()
            : base("name=StudentSystemEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Student> Students { get; set; }
    }
}

StudentSystemEntities继承自DbContext,用来操作数据库。

到此这篇关于Entity Framework使用DataBase First模式实现增删改查的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Entity Framework使用Code First模式管理存储过程

    在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:SqlQuery和ExecuteSqlCommand.为了从存储过程中读取很多数据行,我们只需要定义一个类,我们会将检索到的所有数据行物质化到该类实例的集合中.比如,从下面的存储过程读取数据: CREATE PROCEDURE [dbo].[SelectBooks] @BookTypeName AS NVARCHAR(10) AS BEGIN select B.Name,B.Author,B.Publicati

  • Entity Framework使用配置伙伴创建数据库

    在上一篇文章中讲了如何使用fluent API来创建数据表,不知道你有没有注意到一个问题.上面的OnModelCreating方法中,我们只配置了一个类Product,也许代码不是很多,但也不算很少,如果我们有1000个类怎么办?都写在这一个方法中肯定不好维护.EF提供了另一种方式来解决这个问题,那就是为每个实体类单独创建一个配置类.然后在OnModelCreating方法中调用这些配置伙伴类. 创建Product实体类: using System; using System.Collectio

  • Entity Framework表拆分为多个实体

    概念 表拆分:一个表拆分成多个实体,例如Photograph表,可以拆分为Photograph和PhotographFullImage两张表. 1.Photograph实体结构: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Li

  • Entity Framework使用LINQ操作实体

    一.什么是LINQ TO Entities LINQ,全称是Language-INtegrated Query(集成语言查询),是.NET语言中查询数据的一种技术.LINQ to Entities是一种机制,它促进了使用LINQ对概念模型的查询. 因为LINQ是声明式语言,它让我们聚焦于我们需要什么数据而不是应该如何检索数据.LINQ to Entities在实体数据模型之上提供了一个很好的抽象,所以我们可以使用LINQ来指定检索什么数据,然后LINQ to Entities provider会

  • Entity Framework管理一对二实体关系

    在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系. 要在数据库中配置一对多关系,我们可以依赖EF约定,还可以使用数据注解或Fluent API来显式创建关系.接下来使用捐赠者Donator和支付方法PayWay这两个类来举例子,这里的一对多关系是:一个人可以通过多种支付方式赞助我. 支付方式类PayWay结构如下: using System; using System.Collections.Gene

  • Entity Framework加载控制Loading Entities

    Entity Framework允许控制对象之间的关系,在使用EF的过程中,很多时候我们会进行查询的操作,当我们进行查询的时候,哪些数据会被加载到内存中呢?所有的数据都需要吗?在一些场合可能有意义,例如:当查询的实体仅仅拥有一个相关的子实体时可以加载所有的数据到内存中.但是,在多数情况下,你可能并不需要加载全部的数据, 而是只要加载一部分的数据即可. 默认情况下,EF仅仅加载查询中涉及到的实体,但是它支持两种特性来帮助你控制加载: 1.贪婪加载 2.延迟加载 下面以客户类型.客户和客户邮件三个实

  • Entity Framework使用Code First模式管理数据库

    一.管理数据库连接 1.使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会使用该连接字符串自动计算出数据库的位置和数据库名.比如,我们的数据库上下文定义如下: using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; usin

  • Entity Framework使用Code First模式管理视图

    一.什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化.因此,可以将视图看成是一个原生表数据顶层的一个抽象.例如,我们可以使用视图提供不同安全的级别,也可以简化必须编写的查询,尤其是我们可以在代码中的多个地方频繁地访问使用视图定义的数据.EF Code First模式现在还不完全支持视图,因此我们必须使用一种变通的方法.这种方法是:将视图真正看成是一张表,让EF定义这张表,然后在删除它,最后再创建一个

  • Entity Framework管理并发

    理解并发 并发管理解决的是允许多个实体同时更新,实际上这意味着允许多个用户同时在相同的数据上执行多个数据库操作.并发是在一个数据库上管理多个操作的一种方式,同时遵守了数据库操作的ACID属性(原子性.一致性.隔离性和持久性). 想象一下下面几种可能发生并发的场景: 1.用户甲和乙都尝试修改相同的实体. 2.用户甲和乙都尝试删除相同的实体. 3.用户甲正在尝试修改一个实体时,用户乙已经删除了该实体. 4.用户甲已经请求读取一个实体,用户乙读完该实体之后更新了它. 这些场景可能会潜在地产生错误的数据

  • Entity Framework使用Code First模式管理事务

    一.什么是事务 处理以数据为中心的应用时,另一个重要的话题是事务管理.ADO.NET为事务管理提供了一个非常干净和有效的API.因为EF运行在ADO.NET之上,所以EF可以使用ADO.NET的事务管理功能. 当从数据库角度谈论事务时,它意味着一系列操作被当作一个不可分割的操作.所有的操作要么全部成功,要么全部失败.事务的概念是一个可靠的工作单元,事务中的所有数据库操作应该被看作是一个工作单元. 从应用程序的角度来看,如果我们有多个数据库操作被当作一个工作单元,那么应该将这些操作包裹在一个事务中

  • Entity Framework管理一对一实体关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种关系: 1.一对一关系: one to one 2.一对多关系: one to many 3.多对多关系::many to many 首先要明确关系的概念.关系就是定义两个或多个对象之间是如何关联的.它是由关系两端的多样性值识别的,比如,一对多意味着在关系的一端,只有一个实体,我们有时称为父母:在关

  • Entity Framework实现数据迁移

    一.合并和迁移 1.合并 合并是指“新的实体模型映射到数据库中,更新其结构”,例如:新增了实体类,表现在数据库中就是新增加实体类对应的数据表.删除了实体类,表现在数据库中就是删除了实体类对应的数据表.在一个已经存在的实体类中增加属性,表现在数据库中就是在实体类对应的数据表中新增加字段.在一个已经存在的实体类中删除属性,表现在数据库中就是在实体类对应的数据表中删除字段.修改一个已经存在的实体类中属性的名称或类型,表现在数据库中就是修改实体类对应的数据表中字段的名称或类型. 2.迁移 迁移是指“在更

  • Entity Framework使用Code First的实体继承模式

    目录 一.TPT继承模式 1.Person类 2.使用数据迁移创建数据库 3.填充数据 二.TPH模式 1.创建有继承关系的实体类 2.创建数据上下文 3.使用数据迁移创建数据库 4.不使用默认生成的区别多张表的类型 5.填充数据 6.查询数据 三.TPC模式 1.创建实体类 2.配置数据上下文 3.使用数据迁移生成数据库 4.填充数据 Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Clas

随机推荐