美文网首页
1、初步认识EF

1、初步认识EF

作者: 高调的小丑 | 来源:发表于2018-12-03 09:57 被阅读21次

什么是EF

EF全称EntityFramework,和Dapper一样,是一个ORM工具,那什么是ORM呢? ORM就是Object-Relational Mapping(对象-关系映射,简称ORM),对象和关系数据是业务实体的两种表现形式,ORM就相当于一个中间件,起到了对象和数据库数据之间的映射。

EF有三种开发方式:Code First,DB First和Model First(不推荐使用)

我们主要说说Code First和DB First两种方式:

Code First的方式就是我们需要代码创建类,在代码中标明类与类之间的关系,比如主键、外键等。运行代码后系统会自动的为我们创建数据库和对应的表,但是使用这种方式创建的数据库不方便建立对应的约束关系。因此在正式项目中还是推介使用DB First的方式,先创建数据库,再进行代码的编写。

Code First使用

新建一个控制台应用程序,安装EF的Nuget包。之后修改App.config

<!--新增联系数据库-->
<connectionStrings>
  <add name="UserContext" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=CodeFirstDb;Integrated Security=True"/>
</connectionStrings>

接着我们新建Model文件夹,创建了三个类User、Role和UserRole

public class User
{
    public int ID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public virtual List<UserRole> UserRoles { get; set; }
}

public class Role
{
    public int ID { get; set; }
    public string RoleName { get; set; }
    public string RoleDesc { get; set; }
    public virtual List<UserRole> UserRoles { get; set; }
}

public  class UserRole
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public int RoleID { get; set; }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

代码解释

  1. EF生成数据库时,ID 属性将会成为主键(约定:EF默认会将ID或classnameID生成主键)
  2. EF 生成数据库时,[表名+主键名]这种形式的会成为外键( 约定 )
    例如外键 SysUserID = SysUser(navigation property)+ID(SysUser的主键)
  3. User和UserRole是一对多的关系, Role和UserRole也是一对多的关系。如果是 "多", 属性类型就必须是list(Icollection)

接着我们新建一个DAL文件夹,创建两个类UserContext和UserInitializer

public class UserContext: DbContext
{
    public UserContext() : base("UserContext")
    {}
    
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }
    
    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

代码解释

  1. 通常情况下一DbSet对应数据库中的一张表
  2. 定义了一个构造函数,这边显示的展示了出来
  3. 重写OnModelCreating,可以修改EF的一些默认配置
  4. builder.Conventions.Remove<PluralizingTableNameConvention>();这是移除了EF关于表名的约定。否则生成的表回事复数形式。

接下来我们创建Initializer,使用EF来初始化数据库,将数据插入数据库

public class UserInitializer : DropCreateDatabaseIfModelChanges<UserContext>
{
    protected override void Seed(UserContext context)
    {
        var user = new List<User>
        {
            new User() { UserName="Jack",Password="123",Email="89789@qq.com"},
            new User() { UserName="Curry",Password="123",Email="7897@qq.com"},
            new User() { UserName="Alan",Password="123456",Email="68979@qq.com"}
        };
        user.ForEach(s => context.Users.Add(s));
        
        var role = new List<Role>
        {
            new Role() { RoleName="Admin",RoleDesc="Share EveryThing"},
            new Role() { RoleName="Parts Admin",RoleDesc="This Is Parts Admin"}
        };
        role.ForEach(s => context.Roles.Add(s));
        context.SaveChanges();
    }
}

代码解释

  1. DropCreateDatabaseIfModelChanges说明是在程序第一次运行时会新建数据库,插入测试数据;当model改变的时候删除数据库,重新创建数据库和插入数据

接下来修改配置文件App.config,在<entityFramework>节下新增

<contexts>
  <context type="EFDemo.DAL.UserContext,EFDemo" disableDatabaseInitialization="false">
    <databaseInitializer type="EFDemo.DAL.UserInitializer,EFDemo"></databaseInitializer>
  </context>
</contexts>

代码解释

  1. context 配置节中,type 的值对应context类
  2. databaseInitializer 配置节中,type 的值对应initializer类
  3. 如果某个context节不需要使用了,将disableDatabaseInitialization设置为true

启动页修改代码

static void Main(string[] args)
{
    using (UserContext db = new UserContext())
    {
        db.Users.ToList().ForEach(a =>Console.WriteLine("用户{0}的密码是:{1}",a.UserName, a.Password));
        db.Roles.ToList().ForEach(a =>Console.WriteLine("角色{0}的说明是:{1}",a.RoleName, a.RoleDesc));
    }
    Console.ReadKey();
}

这边只是测试,并没有将数据的对应关系做判断。

运行后我们看到

查看下本地数据库,发现数据库和表已经创建完成。

DB First

DB First的理念就是先创建数据库,再对数据库进行操作


数据库和表创建完成后新建一个控制台应用程序,添加ADO.NET 数据对象模型


新建连接,选择对应的数据库名和用户名密码

之后选择你需要的表即可。

下面写一段代码测试下

static void Main(string[] args)
{
    using (DBFirstDbEntities dbContext = new DBFirstDbEntities())
    {
        UserInfo user = newUserInfo();
        user.UserName = "Curry";
        user.Password = "123456";
        user.Email = "123@qq.com";
        user.Gender =(int)gender.男;
        dbContext.UserInfo.Add(usr);
        dbContext.SaveChanges();
    }
}

public enum gender
{
    男 = 1,
    女 = 2
}

代码解释

  1. 因为连接数据库是非常占用资源的,所以我们使用using在代码块执行完毕后立即释放资源,无需等待CLR的资源回收机制处理
  2. DBFirstDbEntities就是你再新建数据库连接完成后另存到App.config中的


相关文章

  • 1、初步认识EF

    什么是EF EF全称EntityFramework,和Dapper一样,是一个ORM工具,那什么是ORM呢? OR...

  • 2、EF的使用CRUD

    这部分基本都是代码,延续了初步认识EF中code first的代码。 新增数据 这边先查询出用户名为Curry的I...

  • Day 1 初步认识excel

    认识Excel.突破理论 Excel,是什么意思?是Excellent 超越的缩写,这21天里,希望我们超越自己,...

  • (1)初步认识 & 基本设置

    一、认识界面 1、工作信息栏 Alt+滚轮或滚轮滑动:可以调整图像大小 2、修改 文档的工作面(即 画面周围灰色的...

  • 初步认识

    初识C语言 开始 我从高三毕业假期开始涉及C语言学习,经过了九个月左右的学习,初步认识了这种语言的语法和具体特质。...

  • Java并发编程之并发容器ConcurrentHashMap详解

    1 初步认识ConcurrentHashMap,HashMap ,Hashtable ConcurrentHash...

  • EF Core的入门使用总结

    一、初步使用 依赖注入设置 创建DbContext 关于构造函数 —— EF不关心private/public ...

  • PS2019视频教程

    Photoshop2019视频教程 ps教程视频地址 第一章Photoshop初步认识1.初步认识Photosho...

  • 一次线程死锁分析

    现像:服务进程只收消息,无回包,日志正常打印,CPU、内存正常初步分析是死锁 分析过程1.ps -ef |grep...

  • C# 数据操作系列 - 8. EF Core的增删改查

    0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及...

网友评论

      本文标题:1、初步认识EF

      本文链接:https://www.haomeiwen.com/subject/ociecqtx.html