zoukankan      html  css  js  c++  java
  • EntityFramework 简单入个门

      任何一个和数据相关的系统里,数据持久化都是一个不容忽视的问题。

      一直以来,Java 平台出了很多 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平台上,ORM 框架这一块一直没有一个能吊到让几乎所有开发人员改掉以拼写 SQL 语句访问数据库的习惯。

      实际上,在 .NET 平台上,也层出不穷的出现了很多类似的玩意儿,比如Nhibernate、Ibatis,还有微软的亲儿子——坑爹的 LinqToSQL。虽然这么多框架,但是真的没见过 .NET 平台的 ORM 框架能像 Java 里那样普及。

      所幸,微软又搞出来一个儿子——EntityFramework。前几个版本没用过,前几天直接了解了6.1.3版本的。。感觉,真 TMD 好用。。

      鉴于网上的所有教程都太教条式,入门时看起来很坑爹,所以将这篇心得做为随笔,供大家共同学习探讨。

    一、安装框架

      首先,要添加环境。右键项目,可以在 NuGet 里直接安装。如下图:

      

      安装完成以后,项目引用里新增了两个关于EntityFramework的引用,如下图:

       到此,环境就配置好了。

     二、创建Context类和模型类

      0,准备数据库。

      写代码之前,我们得先有一个测试数据库,和一个测试表。

      这里我使用 SQLServer,表结构如下:

      EF的使用有三种模式:Model First、DataBase First 和 Code First。这几种First什么区别,没仔细研究。不过我这里使用的好像是 Code First 构建的项目。这种方式,我只是觉得方便,好用,感觉项目更干净,不用添加乱七八糟的代码和配置。

      1,添加模型类。

      EF 里的模型类和普通的类一样,无非是为类或属性添加一些属性标记对表的关系进行一些映射罢了。如下: 

        [Table("Users")]
        public class UserInfo
        {
            [Key]
            [StringLength(20)]
            [Column("Code")]
            public string Code { get; set; }
    
            [StringLength(20)]
            public string Name { get; set; }
        }

       上面代码中,定义了以下几个关键信息:

        1,类 UserInfo 对应数据库里的 Users 表。

        2,Code 属性对应数据库里的 Code 字段(如果属性名和字段名相同,可以忽略这个配置,比如 Name 属性)。

        3,并且指明两个字符型属性的长度不能超过20个字符。

        4,指示 Code 属性所对应的列是主键列。

      (注:Table、Key、StringLength、Column 这几个类需要引用命名空间 System.ComponentModel.DataAnnotations 和 using System.ComponentModel.DataAnnotations.Schema )

       2,添加 DbContext 类。

       DbContext 类是 EF 的核心,封装了所有数据存取业务相关的逻辑。不管是增删改查还是事务什么什么,所有的数据库操作的业务都可以在这里搞定。。听起来很牛逼!

      听起来很牛逼,事实上更牛逼!

      虽然很牛逼,但是用起来超级简单。比如像下面的代码,就实现了一个简单的 DbContext 类:

        public class DALContext : DbContext
        {
            public DALContext() : base("name=DALContext")
            {
            }
    
            public virtual DbSet<UserInfo> Users { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
    
            }
        }

      寥寥几行,完成了复杂的 DB 操作。

      上面代码简单说明一下:

        1,这个类名自己起,想叫啥叫啥,我这里叫 DALContext。

        2,这个类必需继承 DbContext 类。

        3,在构造方法里,调用父类的构造方法,指明如何连接数据库,这里可以是连接字符串,也可以是配置文件里配置的连接名称(连接名称必需前缀 name= )。

        4,virtual 声明的 DbSet<T> 类型的属性里封装了一大堆数据操作的业务逻辑,我们只需要操作该属性就行了。

        5,有几个表,就声明几个 DbSet<T> 类型的属性就行了。T 是前面代码中声明的 Model ,属性名自己随便起。

        6,OnModelCreating 方法有什么用?具体的我也不知道。

      (这个类要引用命名空间 System.Data.Entity)

      3,配置连接字符串

      打开配置文件,添加一个名为 DALContext 的连接字符串配置。如下图:  

      (打开配置文件我们会发现,里面多了一些关于 entityFramework 的奇怪的东西。至于是不是必要的,删了会不会死人,我也不知道)

      至此,数据库表的映射就Ok了。

     
    三、编写测试代码

      废话不说,上代码:

            static void Main(string[] args)
            {
                using (DALContext db = new DALContext())
                {
                    try
                    {
                        db.Users.Add(new UserInfo() {
                            Code = DateTime.Now.Ticks.ToString(),
                            Name = "张三"
                        });
    
                        IEnumerable<UserInfo> users = db.Users.Where<UserInfo>(u => u.Name == "张三");
    
                        foreach(var u in users)
                        {
                            Console.WriteLine(string.Format("{0} - {1}",u.Code,u.Name));
                        }
    
                        db.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
    
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
            }

      在 Main 方法里,我们声明了一个 DALContext 对象 db,为了便于对象资源的释放,这里使用 using  将其包起来。

      这段代码实现了以下功能:

        1,访问 db 对象 的 Users 属性,使用 Add 方法像操作一个集合一样向数据库表里增加一条记录。

        2,访问 db 对象 的 Users 属性,使用 Where 方法根据条件查询一批数据对象,保存在变量 users 里,并循环输出到控制台。

        3,使用 db 对象的 SaveChanges 方法,将对数据库的变更提交。

      运行以后,结果如下:

      上面例子实现了增加和查询功能,删除和修改功能类似于操作集合,只要保证最后调用 SaveChanges 方法将修改提交就行。

  • 相关阅读:
    STL常用容器☞String容器
    初识STL
    函数模板
    多态
    运算符重载
    友元
    对象的初始化和清理
    C++内存分区模型
    传值和传地址
    const的使用
  • 原文地址:https://www.cnblogs.com/zhhh/p/6298689.html
Copyright © 2011-2022 走看看