美文网首页
使用EntityFramework 6 连接 MySql (DB

使用EntityFramework 6 连接 MySql (DB

作者: AlistairChow | 来源:发表于2018-09-14 14:59 被阅读0次

    软件环境

    开发环境:VS 2017
    .NET Framework: 4.6.1
    MySQL: 8.0
    MySQL Connector Net:8.0.12
    MySQL for Visual Studio:1.2.8

    创建测试数据库

    创建数据库efdemo并创建两张表,user和role

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : localhost_3306
    Source Server Version : 80012
    Source Host           : localhost:3306
    Source Database       : efdemo
    
    Target Server Type    : MYSQL
    Target Server Version : 80012
    File Encoding         : 65001
    
    Date: 2018-09-14 12:09:01
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for role
    -- ----------------------------
    DROP TABLE IF EXISTS `role`;
    CREATE TABLE `role` (
      `role_id` int(11) NOT NULL,
      `role_name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`role_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    -- ----------------------------
    -- Records of role
    -- ----------------------------
    INSERT INTO `role` VALUES ('0', '管理员');
    INSERT INTO `role` VALUES ('1', '游客');
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `user_id` int(11) NOT NULL,
      `user_name` varchar(255) DEFAULT NULL,
      `role_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`user_id`),
      KEY `FK_USER_ROLE` (`role_id`),
      CONSTRAINT `FK_USER_ROLE` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('0', 'alistair', '0');
    INSERT INTO `user` VALUES ('1', 'guest', '1');
    

    创建测试工程

    创建一个名为EFMySqlDemo的控制台项目

    引用EF Core 及 工具包

    项目引用 Pomelo.EntityFrameworkCore.MySql
    在程序包管理器控制台中输入以下命令

    Install-Package Pomelo.EntityFrameworkCore.MySql
    Install-Package Microsoft.EntityFrameworkCore.Tools
    

    通过命令创建实体

    同样在程序包管理器控制台中输入以下命令:

    Scaffold-DbContext "Server=localhost;Port=3306;DataBase=efdemo;User=root;Password=p@ssw0rd;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models
    

    该命令传递了数据库的连接字符串,和实体输出路径(Models)

    执行完成后,可以看到,在项目中新生成了一个Models文件夹,其中包含了Context和两个表的实体:

    到此为止,DBFirst已经完成,可以通过操作efdemoContext来进行数据的相关操作。

    例如我们查找userId为0的用户

    namespace EFMySqlDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                efdemoContext context = new efdemoContext();
                User user = context.User.Find(0);
                Console.WriteLine(user.UserName);
                Console.Read();
            }
        }
    }
    

    执行后将会打印出对应UserName。


    由于User表和Role表有包含一个外键,所以在实体中我们也可以看到User对象里面包含了Role对象。

    public partial class User
        {
            public int UserId { get; set; }
            public string UserName { get; set; }
            public int? RoleId { get; set; }
    
            public Role Role { get; set; } //包含了Role对象
        }
    

    现在我们不仅想要获得用户名,还想要获得当前用户的角色名,那么修改代码为:

     class Program
        {
            static void Main(string[] args)
            {
                efdemoContext context = new efdemoContext();
                User user = context.User.Find(0);
                Console.WriteLine(user.UserName);
                Console.WriteLine(user.Role.RoleName);
                Console.Read();
            }
        }
    

    运行后会报异常,原因是在数据通过EF映射的时候,默认情况下并不会自动加入外键信息。


    笔者下面使用Repository的模式来搭建数据层。

    创建Repository

    引用UnitOfWork,同样在程序包管理器中执行命令,来引入类库

    Install-Package Microsoft.EntityFrameworkCore.UnitOfWork
    

    引用完成之后,我们修改代码:

        class Program
        {
            static void Main(string[] args)
            {
                efdemoContext context = new efdemoContext();
                User user1 = context.User.Find(0);
                Console.WriteLine(user1.UserName);
                if (user1.Role != null)
                {
                    Console.WriteLine(user1.Role.RoleName);
                }
                else
                {
                    Console.WriteLine("Role 对象为空");
                }
    
                Console.WriteLine("--------------------------");
                Repository<User> repository = new Repository<User>(context);
                User user2 = repository.GetFirstOrDefault(
                    predicate: u => u.UserId == 0,
                    include: source => source.Include(s => s.Role));
                Console.WriteLine(user2.UserName);
                Console.WriteLine(user2.Role.RoleName);
                Console.Read();
            }
        }
    

    打印结果为:


    相关文章

      网友评论

          本文标题:使用EntityFramework 6 连接 MySql (DB

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