因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql

数据库迁移时,nvarchar 要改成varchar,编码选utf-8

在Startup.cs里

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3.  
  4. //Use MySql-----------------------
  5. string connString = "Server=localhost;Port=3306;Database=test;User=root;Password=xxx;";
  6. services.AddDbContextPool<CRMContext>(tt => tt.UseMySql(connString));
  7. }

CRMContext类

  1. public class CRMContext: DbContext
  2. {
  3. public CRMContext(DbContextOptions<CRMContext> options): base(options)
  4. {
  5. }
  6.  
  7. protected override void OnModelCreating(ModelBuilder modelBuilder)
  8. { //手工指定table名
  9. //modelBuilder.Entity<User>().ToTable("User");
  10.  
  11. //批量指定前缀CRM
  12. foreach (var entity in modelBuilder.Model.GetEntityTypes())
  13. {
  14. entity.Relational().TableName =
  15. $"CRM{entity.ClrType.Name}";
  16. }
  17.  
  18. //base.OnModelCreating(modelBuilder);
  19. }
  20. //https://stackoverflow.com/questions/4270794/why-is-my-dbcontext-dbset-null
  21. //必须设为property,如果是field,则会一直为null
  22. public DbSet<User> Users { get; set; }
  23. public DbSet<Department> Departments{ get; set; }
  24. }
  25. }

在Controller里可以通过构造函数,依赖注入使用

  1. [Route("api/[controller]")]
  2. public class UserController : Controller
  3. {
  4. private readonly CRMContext _context;
  5.  
  6. public UserController(CRMContext context)
  7. {
  8. _context = context;
  9. }
  10.  
  11. // GET: api/values
  12. [HttpGet]
  13. public IEnumerable<string> Get()
  14. {
  15. return _context.Users.Select(tt=>tt.UserName).ToList();
  16. }
  17. }

netCore的solution里多了一个WWWRoot的文件夹,里面都是放一些静态文件js,css,image等, 这个目录默认就是网站根目录,这样把动态文件和静态文件完全分离开了.

请参考这篇文章: ASP.NET Core使用静态文件、目录游览与MIME类型管理

如果要用多数据库迁移.可以这样

  1. //Use MySql-----------------------
  2. //services.AddDbContextPool<CRMContext>(tt => tt.UseMySql(Configuration.GetConnectionString("MySqlConnection")));
  3.  
  4. //-----Use SqlServer, 默认用offset分页(这个是sql2012版本之后才有的功能),之前的版本要改成RowNumber分页
  1. services.AddDbContextPool<CRMContext>( tt => tt.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"), opt=>opt.UseRowNumberForPaging()) );

把多个数据库连接写在appsetting.json

  1. {
  2. "ConnectionStrings": {
  3. "SqlServerConnection": "Server=.\\sqlexpress;Database=test;User ID=sa;Password=xxxx;",
  4. "MySqlConnection": "Server=localhost;Port=3306;Database=test;User=root;Password=xxxx;"
  5. },
  6. "Logging": {
  7. "IncludeScopes": false,
  8. "LogLevel": {
  9. "Default": "Warning"
  10. }
  11. }
  12. }

用dotnet ef的命令迁移数据库.

  1. dotnet build
  2. dotnet ef migrations remove
  3. dotnet ef migrations add Initial
  4. dotnet ef database update Initial
  5. pause

如果出错, 未找到与命令“dotnet-ef”匹配的可执行文件,

请参考这个http://www.cnblogs.com/dupeng0811/p/no-executable-found-matching-command-dotnet-ef.html

如果出错,

The current CSharpHelper cannot scaffold literals of type 'Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding'. Configure your services to use one that can.

  1. 解决方案:程序包管理控制台->Install-Package Microsoft.EntityFrameworkCore.Design

如果出现这个错误:

  1. table 'TableName' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

要在DbContext文件里指定

  1. modelBuilder.Entity<Product>().HasOne(p => p.Category)
  2. .WithMany(c => c.Products).OnDelete(DeleteBehavior.Restrict)
  3. .HasForeignKey(p => p.CategoryId);

对比Data Annotation, Fluent API

 

把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql的更多相关文章

  1. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  2. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  3. 把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析

    因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了. 1. 为什么会有跨平台的.Net Core  近年来,我们已 ...

  4. 把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题

    1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版) 在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用 ...

  5. 把旧系统迁移到.Net Core 2.0 日记 (17) --多租户和SoftDelete

    在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...

  6. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  7. 把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel

    迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...

  8. 把旧系统迁移到.Net Core 2.0 日记(5) Razor/HtmlHelper/资源文件

    net core 的layout.cshtml文件有变化, 区分开发环境和非开发环境. 开发环境用的是非压缩的js和css, 正式环境用压缩的js和css <environment includ ...

  9. 把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 (转)

    关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...

随机推荐

  1. hashtable详解

    hashtable也比称作哈希表,键值对或者关联数组 1. 先引用using System.Collections;命名空间 用于处理和表现key/value的键值对,其中key通常用来快速查找,同时 ...

  2. QT---事件系统

    1         QT事件系统 1.1  事件的定义 QT中事件是有专门的类QEvent,常见的有键盘事件QKeyEvent.鼠标事件QMouseEvent和定时器事件QTimerEvent.例如用 ...

  3. top 命令常用操作

    1.显示进程参数 top -c 下面操作为top命令后操作 2.按cpu/mem排序 shift + p/m 3.高亮 排序列 按x键 4.高亮 变化进程行 按b键 5.显示cpu每核的运行状态 按1 ...

  4. python中简单的递归(断点报错的小福利)

    首先要先理解什么是递归? 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 下面讲了一个很简单的递归函数 def clac(n): print(n) if int( ...

  5. HAL无阻塞延时

    //实现间隔time_interval时间点亮红灯(此时间间隔并不是绝对的,是大于等于的关系)//用于系统要求无延时且延时时间粗略的场合,比如间隔一段时间采样数据,间隔一段时间点亮状态灯等//HAL_ ...

  6. Spring Cloud之注册中心搭建

    一.注册中心服务端搭建 1)引入相关Maven坐标 <dependency> <groupId>org.springframework.cloud</groupId> ...

  7. server2008远程开端口的方法

    今天在通过本地链接远程oracle数据库的时候发现了个问题,建立好连接了,可是一直没连上,后面发现是防火墙的1521的oracle端口没开启.开启的方法可以采用如下方法: 操作:开始→控制面板→Win ...

  8. 7 selenium 模块

    selenium 模块 一.简介 1.Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. 2.自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接 ...

  9. 59 Cookie 与 Session

    Cookie Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对. 客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie). 当客户端向服务器发出请求时会把所 ...

  10. Vue音乐项目笔记(四)(搜索页面提取重写)

    1.如何通过betterScroll组件实现上拉刷新 https://blog.csdn.net/weixin_40814356/article/details/80478440 2.搜索页面跳转单曲 ...