设为首页 收藏本站
查看: 1572|回复: 1

[经验分享] ASP.NET Core:使用EntityFrameworkCore操作MySql来丰富仓储模块

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2017-12-12 13:41:08 | 显示全部楼层 |阅读模式
概述
  上一篇简单介绍了Dapper的基本用法,数据的存储为SqlServer。那么这一篇就记录一下使用EFCore来操作MySql的一些方式,这种模式比较适合那种一个项目中需要操作多种数据库的模式。不过因为微软官方并没有提供其驱动,所以我们需要借助MySql官方提供的驱动进行基本的增删改查操作。这样一来我们也可以将数据库迁移到Linux服务器上了,是不是很激动。当然了,Sql Server Love Linux!大家同样是有目共睹,SQL Server 2017 Preview版本也已经支持在Linux上部署,但是当我看到需要至少3.25G的内存的时候,我是有点小情绪的,有要了解的话大家可以移步这里,很期待微软下一步会有什么样的大动作!好了,正文开始。
DSC0000.png


一、在Windows上安装并配置MySql
  1、先到官网上下载最新的发行版本5.7.18(社区版),选择mysql-installer-community-5.7.18.1.msi,因为它已经包含了Server和Workbench。
DSC0001.png

  2、双击下载好的文件开始安装,这个版本的安装体验自我感觉已经比5.5的好了很多。如果嫌麻烦的话,你可以直接选择第一个选项“Developer Default”——默认的开发环境来进行安装,非常省事。不过我是一个.Netor,有些内容并不是必须的,所以我选择“Customer”自定义来进行安装了,接着下一步、
DSC0002.png

  3、下面我列出来自定义选择的一些安装内容简介

MySQL Server
MySQL 服务器(必不可少,你懂的~)MySQL Workbench
MySQL的数据库建模工具(类似于SQL Server Management Studio)MySQL Notifier
MySQL的DBA辅助工具(安装好之后右下角会有一个小托盘)Connector/ODBC
数据库与应用程序的互连标准
Connnector/NET
.NET程序的数据库驱动  其他一些高级功能比如MySQL Router,VS的可视化连接工具,Shell,文档介绍等等就暂时忽略,以后需要的话可以随时安装
DSC0003.png

  4、接下来选择一个安装路径,然后点击Execute进行安装即可
DSC0004.png

  5、服务器配置类型选择开发环境“Development Machine”,端口默认3306,然后下一步
DSC0005.png

  6、然后给Root账户设置一个密码。其他账户你可以选择暂时不添加,继续下一步
DSC0006.png

  7、将MySQL配置成一个Windows服务,并设置为开机启动
DSC0007.png

  8、应用你的所有配置,并完成安装。整个过程耗时还是挺少的
DSC0008.png

  9、启动MySQL,输入你刚才设置的root账户的密码进行登陆。出现以下页面,说明已经大功告成。
DSC0009.png


二、添加MySql.Data.EntityFrameworkCore到仓储模块
  1、打开工具=》Nuget包管理器=》程序包管理控制台,输入以下命令进行包的安装,同时依赖也会跟着一起引入到项目中去
  

Install-Package MySql.Data.EntityFrameworkCore -Pre  

  几个注意点这里说明一下:
  a)、通过Nuget包管理器界面进行安装的时候记得勾选“包括预发行版”,然后再进行搜索
  b)、命令行记得带上“-Pre”,表示预发行版本
  c)、安装的默认项目时选择仓储模块Light.Repository
DSC00010.png

  2、构建MySQL数据库上下文,注意红色字体的描述
  

    /// <summary>  /// MySQL数据库访问上下文
  /// </summary>

  public>  {
  public LightContext(DbContextOptions<LightContext> options)
  : base(options)
  {
  }
  

  public DbSet<User> User { get; set; }
  }
  

  

    /// <summary>  /// MySQL的数据库配置
  /// </summary>

  public>  {
  /// <summary>
  /// 默认的MySQL的链接字符串
  /// </summary>
  private const string DefaultMySqlConnectionString = "server=localhost;userid=root;pwd=sasa;port=3306;database=light;";
  public static LightContext CreateContext(string mySqlConnectionString = null)
  {
  if (string.IsNullOrWhiteSpace(mySqlConnectionString))
  {
  mySqlConnectionString = DefaultMySqlConnectionString;
  }
  var optionBuilder = new DbContextOptionsBuilder<LightContext>();
  optionBuilder.UseMySQL(mySqlConnectionString);
  var context = new LightContext(optionBuilder.Options);
  context.Database.EnsureCreated();//针对当前访问的上下文对象,如果数据库中存在该表,则不做修改;否则的话进行创建
  return context;
  }
  }
  

  3、接下来就是用我们准备好的数据库上下文对用户进行简单的CRUD操作。因为得益于面向接口编程和DI的思想,只需要用EF的方式实现IUserRepository中定义的方法,然后将此注入仓储即可
  

    /// <summary>  /// MySql中的用户仓储实现
  /// </summary>

  public>  {
  /// <summary>
  /// 创建一个用户
  /// </summary>
  /// <param name="entity">用户</param>
  /// <param name="connectionString">链接字符串</param>
  /// <returns></returns>
  public bool CreateEntity(User entity, string connectionString = null)
  {
  using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
  {
  context.User.Add(entity);
  return context.SaveChanges() > 0;
  }
  }
  

  /// <summary>
  /// 根据主键Id删除一个用户
  /// </summary>
  /// <param name="id">主键Id</param>
  /// <param name="connectionString">链接字符串</param>
  /// <returns></returns>

  public bool DeleteEntityById(int>  {
  using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
  {
  context.User.Remove(context.Find<User>(id));
  return context.SaveChanges() > 0;
  }
  }
  

  /// <summary>
  /// 获取所有用户
  /// </summary>
  /// <param name="connectionString">链接字符串</param>
  /// <returns></returns>
  public IEnumerable<User> RetriveAllEntity(string connectionString = null)
  {
  using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
  {
  List<User> allUsers = new List<User>();
  allUsers.AddRange(context.User);
  return allUsers;
  }
  }
  

  /// <summary>
  /// 根据主键Id获取一个用户
  /// </summary>
  /// <param name="id">主键Id</param>
  /// <param name="connectionString">链接字符串</param>
  /// <returns></returns>

  public User RetriveOneEntityById(int>  {
  using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
  {
  return context.Find<User>(id);
  }
  }
  

  /// <summary>
  /// 修改一个用户
  /// </summary>
  /// <param name="entity">要修改的用户</param>
  /// <param name="connectionString">链接字符串</param>
  /// <returns></returns>
  public bool UpdateEntity(User entity, string connectionString = null)
  {
  using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
  {
  context.Update<User>(entity);
  return context.SaveChanges() > 0;
  }
  }
  }
  

  

    /// <summary>  /// 注入仓储层
  /// </summary>

  public>  {
  public static void ConfigureRepository(IServiceCollection services)
  {
  //services.AddSingleton<IUserRepository, UserRepository>();
  services.AddSingleton<IUserRepository, UserRepositoryMySql>();
  }
  }
  

  4、至此,你上层的所有代码不用进行任何的变动,系统便从SqlServer切换到了MySql上。然后试着用API插入一个用户信息看看,是不是User表自动创建,并且产生了一条记录。
DSC00011.png

  其实查看表结构不难发现,EF会默认将属性名为Id的int型作为主键,并且设置为自增。字符串string类型的话默认可空且长度为255,其他则非空。那么我们是否可以修改默认的表结构呢,答案肯定是:可以的

三、配置上下文中的数据库对象
  1、在LightContext中重写模型绑定的方法OnModelCreating,然后设置对应实体属性的规则,这种方式叫做Fluent API
  

protected override void OnModelCreating(ModelBuilder modelBuilder)  
{
  modelBuilder.Entity
<User>(m =>  {
  m.Property(n
=> n.UserName).HasMaxLength(50);//设置用户名最大长度为50个字符  m.Property(n => n.Password).HasMaxLength(20).IsRequired();//设置密码不可空且最大20个字符
  
      });
  base.OnModelCreating(modelBuilder);
  
}
  

  2、本来想用Microsoft.EntityFrameworkCore.Tools结合dotnet ef相关命令直接进行更新数据库,但最后失败了
DSC00012.png

  大致意思是说.NETStandard类库不适用此CLI,除非换成启动项目。然后查了下,官方也给出了解释
DSC00013.png

  3、所以我这边偷了一个懒,直接删除刚刚生成的表,然后重新运行项目,这相当于重建了数据库表。接着查询下MySQL中User表的新结构,看看是不是已经发生了变化
DSC00014.png


四:总结
  其实EF Core还有更多高级的用法,实体模型间的关系,数据库的迁移等等,需要我们更加深入的学习和实践。除了官方文档外,这里安利一个挺不错的学习网站:learnentityframeworkcore,那么就到这里了,共同进步!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423337-1-1.html 上篇帖子: mysql中concat 和 group_concat()的用法 下篇帖子: mysql 递归查询sql语句的实现
累计签到:16 天
连续签到:4 天
发表于 2017-12-12 13:44:41 | 显示全部楼层
感谢楼主分享···············

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表