在项目中使用EF Core还是比较容易的,在这里我们使用的版本是EF Core 2.2.

1.使用nuget获取EF Core包

这个示例项目使用的是SQLSERVER,所以还需要下载Microsoft.EntityFrameworkCore.SqlServer这个包

2.在Startup类的Configure方法中设置默认的数据库访问连接字符串

  1. //数据库连接字符串
  2. Framework.Core.Configuration.AddItem("ConnectionStrings",Configuration.GetSection("ConnectionStrings").Value);

PS:我这里并没有使用DI注入的方式去使用EFCORE的实例,还是使用传统的New的方式,所以并不需要在Startup中进行注入

3.在Mango.EFCore类库项目中创建一个EFDbContext类继承自DbContext我们就能在其它地方使用EFCore了,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Microsoft.EntityFrameworkCore;
  5. using Microsoft.EntityFrameworkCore.Metadata;
  6. using Mango.Entity;
  7. namespace Mango.Framework.EFCore
  8. {
  9. public class EFDbContext : DbContext
  10. {
  11. public EFDbContext()
  12. {
  13.  
  14. }
  15.  
  16. public EFDbContext(DbContextOptions<EFDbContext> options): base(options)
  17. {
  18. }
  19. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  20. {
  21. if (!optionsBuilder.IsConfigured)
  22. {
  23. optionsBuilder.UseSqlServer(Core.Configuration.GetItem("ConnectionStrings"));
  24. }
  25. }
  26. #region Entity DbSet<>
  27. public virtual DbSet<m_WebSiteConfig> m_WebSiteConfig { get; set; }
  28. public virtual DbSet<m_PostsRecords> m_PostsRecords { get; set; }
  29. public virtual DbSet<m_WebSiteNavigation> m_WebSiteNavigation { get; set; }
  30.  
  31. public virtual DbSet<m_Sms> m_Sms { get; set; }
  32.  
  33. public virtual DbSet<m_ManagerAccount> m_ManagerAccount { get; set; }
  34. public virtual DbSet<m_ManagerMenu> m_ManagerMenu { get; set; }
  35. public virtual DbSet<m_ManagerPower> m_ManagerPower { get; set; }
  36. public virtual DbSet<m_ManagerRole> m_ManagerRole { get; set; }
  37. public virtual DbSet<m_Message> m_Message { get; set; }
  38. public virtual DbSet<m_Navigation> m_Navigation { get; set; }
  39. public virtual DbSet<m_NavigationClassify> m_NavigationClassify { get; set; }
  40. public virtual DbSet<m_Posts> m_Posts { get; set; }
  41. public virtual DbSet<m_PostsChannel> m_PostsChannel { get; set; }
  42. public virtual DbSet<m_PostsAnswer> m_PostsAnswer { get; set; }
  43. public virtual DbSet<m_PostsAnswerRecords> m_PostsAnswerRecords { get; set; }
  44. public virtual DbSet<m_PostsAttention> m_PostsAttention { get; set; }
  45. public virtual DbSet<m_PostsComments> m_PostsComments { get; set; }
  46. public virtual DbSet<m_PostsCommentsRecords> m_PostsCommentsRecords { get; set; }
  47. public virtual DbSet<m_PostsTags> m_PostsTags { get; set; }
  48. public virtual DbSet<m_User> m_User { get; set; }
  49. public virtual DbSet<m_UserGroup> m_UserGroup { get; set; }
  50. public virtual DbSet<m_UserGroupMenu> m_UserGroupMenu { get; set; }
  51. public virtual DbSet<m_UserGroupPower> m_UserGroupPower { get; set; }
  52. #endregion
  53. }
  54. }

4.接下来我们在Mango.Repository仓储类库项目中使用EFCore,代码示例如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Linq;
  5. using Mango.Framework.EFCore;
  6. using Microsoft.EntityFrameworkCore;
  7. using System.Data.SqlClient;
  8. namespace Mango.Repository
  9. {
  10. public class AuthorizationRepository
  11. {
  12. private EFDbContext _dbContext = null;
  13. public AuthorizationRepository()
  14. {
  15. _dbContext = new EFDbContext();
  16. }
  17. /// <summary>
  18. /// 根据用户组获取权限
  19. /// </summary>
  20. /// <param name="GroupId"></param>
  21. /// <returns></returns>
  22. public List<Models.UserGroupPowerModel> GetPowerData(int groupId)
  23. {
  24. var query = from ugp in _dbContext.m_UserGroupPower
  25. join ugm in _dbContext.m_UserGroupMenu
  26. on ugp.MId equals ugm.MId
  27. where ugp.GroupId == groupId
  28. select new Models.UserGroupPowerModel()
  29. {
  30. GroupId=ugp.GroupId.Value,
  31. MId=ugm.MId.Value,
  32. MName=ugm.MName,
  33. AreaName=ugm.AreaName,
  34. ControllerName=ugm.ControllerName,
  35. ActionName=ugm.ActionName
  36. };
  37. return query.ToList();
  38. }
  39. }
  40. }

以上介绍了EFCore的基本使用示例,其实我们平常在项目中会将一些常用的增删改统一封装起来,我们创建一个CommonRepository类,代码如下:

  1. using System;
  2. using System.Reflection;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using Mango.Framework.EFCore;
  6. using Microsoft.EntityFrameworkCore;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Mango.Repository
  9. {
  10. public class CommonRepository
  11. {
  12. private EFDbContext _dbContext = null;
  13. public CommonRepository()
  14. {
  15. _dbContext = new EFDbContext();
  16. }
  17. /// <summary>
  18. /// 添加记录
  19. /// </summary>
  20. /// <typeparam name="TEntity"></typeparam>
  21. /// <param name="entity"></param>
  22. /// <returns></returns>
  23. public bool Add<TEntity>(TEntity entity) where TEntity:class
  24. {
  25. _dbContext.Add(entity);
  26. ;
  27. }
  28. /// <summary>
  29. /// 根据Id获取指定记录
  30. /// </summary>
  31. /// <typeparam name="TEntity"></typeparam>
  32. /// <param name="Id"></param>
  33. /// <returns></returns>
  34. public TEntity Find<TEntity>(int Id) where TEntity : class
  35. {
  36. return _dbContext.Find<TEntity>(Id);
  37. }
  38. /// <summary>
  39. /// 更新记录
  40. /// </summary>
  41. /// <typeparam name="TEntity"></typeparam>
  42. /// <param name="entity"></param>
  43. /// <param name="IsFind"></param>
  44. /// <returns></returns>
  45. public bool Update<TEntity>(TEntity entity, bool isFind) where TEntity : class
  46. {
  47. _dbContext.Update(entity);
  48.  
  49. ;
  50. }
  51. /// <summary>
  52. /// 更新记录(修改指定的列)
  53. /// </summary>
  54. /// <typeparam name="TEntity"></typeparam>
  55. /// <param name="entity"></param>
  56. /// <param name="properties"></param>
  57. /// <returns></returns>
  58. public bool Update<TEntity>(TEntity entity) where TEntity : class
  59. {
  60. _dbContext.Entry(entity).State = EntityState.Unchanged;
  61. //
  62. Type type= entity.GetType();
  63. //处理实体类属性
  64. PropertyInfo[] properties = type.GetProperties();
  65. foreach (var property in properties)
  66. {
  67. object value = property.GetValue(entity, null);
  68. var key = property.GetCustomAttribute<KeyAttribute>();
  69. if (value != null&& key==null)
  70. {
  71. _dbContext.Entry(entity).Property(property.Name).IsModified = true;
  72. }
  73. }
  74. ;
  75. }
  76. /// <summary>
  77. /// 删除记录
  78. /// </summary>
  79. /// <typeparam name="TEntity"></typeparam>
  80. /// <param name="entity"></param>
  81. /// <returns></returns>
  82. public bool Delete<TEntity>(TEntity entity) where TEntity : class
  83. {
  84. _dbContext.Remove(entity);
  85. ;
  86. }
  87. }
  88. }

PS:这篇EFCore的基础使用就到此为止,详情请下载源代码查看,下一篇将讲解如何基于EFCore进行一些基础的扩展

使用Asp.Net Core MVC 开发项目实践[第二篇:EF Core]的更多相关文章

  1. 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]

    先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...

  2. 使用Asp.Net Core MVC 开发项目实践[第五篇:缓存的使用]

    项目中我们常常会碰到一些数据,需要高频率用到但是又不会频繁变动的这类,我们就可以使用缓存把这些数据缓存起来(比如说本项目的导航数据,帖子频道数据). 我们项目中常用到有Asp.Net Core 本身提 ...

  3. 使用Asp.Net Core MVC 开发项目实践[第三篇:基于EF Core的扩展]

    上篇我们说到了EFCore的基础使用,这篇我们将讲解下基于EFCore的扩展. 我们在Mango.Framework.EFCore类库项目中创建一个类名EFExtended的扩展类,并且引入相关的命名 ...

  4. 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]

    上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...

  5. ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

    原文:ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了 ...

  6. 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版

    “全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...

  7. Pro ASP.NET Core MVC 第6版 第二章(前半章)

    目录 第二章 第一个MVC 应用程序 学习一个软件开发框架的最好方法是跳进他的内部并使用它.在本章,你将用ASP.NET Core MVC创建一个简单的数据登录应用.我将它一步一步地展示,以便你能看清 ...

  8. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  9. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

随机推荐

  1. mysql 在原有的时间上加10个月或者一年

    UPDATE SERVER_TIME_LEFT SET END_TIME = DATE_ADD(END_TIME, INTERVAL 10 MONTH) WHERE SHOP_ID BETWEEN 1 ...

  2. JS验证码邮件

    js var time = 30; var canSend = true; function f5() { if (canSend) {//判断是否要ajax发送刷新验证码 验证码在后台刷新 //al ...

  3. 系统性能--CPU

    对于cpu,目前比较关心的是cpu的利用率还有cpu的load,或者还有cpu运行队列. cpu利用率 cpu利用率分为sys,us.分别为操作系统和用户进程所占用的cpu利用率.sys的占用,一般是 ...

  4. 修改VS 中的代码编辑颜色-Vs主题修改

    有个性的开发人员总是喜欢使用属于的主题和配色方案,它们可以看出开发者的个性,更改它们可以缓解审美疲劳,总之选择一个适合自己的解决方案可能极大的增加自己的编码舒适度. 1. 配色方案的选择和使用 手动修 ...

  5. hadoop2.4.0伪分布式搭建以及分布式关机重启后datanode没起来的解决办法

    1.准备Linux环境 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip ...

  6. 【转】UniGUI Session管理說明

    [转]UniGUI Session管理說明 (2015-12-29 15:41:15) 转载▼   分类: uniGUI 台中cmj朋友在uniGUI中文社区QQ群里发布的,转贴至此. UniGUI ...

  7. LeNet,AlexNet,GoogleLeNet,VggNet等网络对比

    CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段 ...

  8. WebViewJavascriptBridge浅析

    WebViewJavascriptBridge是一个Objective-C与JavaScript进行消息互通的三方库.通过WebViewJavascriptBridge,我们可以很方便的实现OC和Ja ...

  9. ReactNative学习笔记(四)热更新和增量更新

    概括 关于RN的热更新,网上有很多现成方案,但是一般都依赖第三方服务,我所希望的是能够自己管控所有一切,所以只能自己折腾. 热更新的思路 热更新一般都是更新JS和图片,也就是在不重新安装apk的情况下 ...

  10. 人工智能必须要知道的语义分割模型:DeepLabv3+

    图像分割是计算机视觉中除了分类和检测外的另一项基本任务,它意味着要将图片根据内容分割成不同的块.相比图像分类和检测,分割是一项更精细的工作,因为需要对每个像素点分类,如下图的街景分割,由于对每个像素点 ...