把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql
因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql
数据库迁移时,nvarchar 要改成varchar,编码选utf-8
在Startup.cs里
- public void ConfigureServices(IServiceCollection services)
- {
- //Use MySql-----------------------
- string connString = "Server=localhost;Port=3306;Database=test;User=root;Password=xxx;";
- services.AddDbContextPool<CRMContext>(tt => tt.UseMySql(connString));
- }
CRMContext类
- public class CRMContext: DbContext
- {
- public CRMContext(DbContextOptions<CRMContext> options): base(options)
- {
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- { //手工指定table名
- //modelBuilder.Entity<User>().ToTable("User");
- //批量指定前缀CRM
- foreach (var entity in modelBuilder.Model.GetEntityTypes())
- {
- entity.Relational().TableName =
- $"CRM{entity.ClrType.Name}";
- }
- //base.OnModelCreating(modelBuilder);
- }
- //https://stackoverflow.com/questions/4270794/why-is-my-dbcontext-dbset-null
- //必须设为property,如果是field,则会一直为null
- public DbSet<User> Users { get; set; }
- public DbSet<Department> Departments{ get; set; }
- }
- }
在Controller里可以通过构造函数,依赖注入使用
- [Route("api/[controller]")]
- public class UserController : Controller
- {
- private readonly CRMContext _context;
- public UserController(CRMContext context)
- {
- _context = context;
- }
- // GET: api/values
- [HttpGet]
- public IEnumerable<string> Get()
- {
- return _context.Users.Select(tt=>tt.UserName).ToList();
- }
- }
netCore的solution里多了一个WWWRoot的文件夹,里面都是放一些静态文件js,css,image等, 这个目录默认就是网站根目录,这样把动态文件和静态文件完全分离开了.
请参考这篇文章: ASP.NET Core使用静态文件、目录游览与MIME类型管理
如果要用多数据库迁移.可以这样
- //Use MySql-----------------------
- //services.AddDbContextPool<CRMContext>(tt => tt.UseMySql(Configuration.GetConnectionString("MySqlConnection")));
- //-----Use SqlServer, 默认用offset分页(这个是sql2012版本之后才有的功能),之前的版本要改成RowNumber分页
- services.AddDbContextPool<CRMContext>( tt => tt.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"), opt=>opt.UseRowNumberForPaging()) );
把多个数据库连接写在appsetting.json
- {
- "ConnectionStrings": {
- "SqlServerConnection": "Server=.\\sqlexpress;Database=test;User ID=sa;Password=xxxx;",
- "MySqlConnection": "Server=localhost;Port=3306;Database=test;User=root;Password=xxxx;"
- },
- "Logging": {
- "IncludeScopes": false,
- "LogLevel": {
- "Default": "Warning"
- }
- }
- }
用dotnet ef的命令迁移数据库.
- dotnet build
- dotnet ef migrations remove
- dotnet ef migrations add Initial
- dotnet ef database update Initial
- 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.
- 解决方案:程序包管理控制台->Install-Package Microsoft.EntityFrameworkCore.Design
如果出现这个错误:
- 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文件里指定
- modelBuilder.Entity<Product>().HasOne(p => p.Category)
- .WithMany(c => c.Products).OnDelete(DeleteBehavior.Restrict)
- .HasForeignKey(p => p.CategoryId);
对比Data Annotation, Fluent API
把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql的更多相关文章
- 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别
EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...
- 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis
安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...
- 把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析
因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了. 1. 为什么会有跨平台的.Net Core 近年来,我们已 ...
- 把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题
1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版) 在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用 ...
- 把旧系统迁移到.Net Core 2.0 日记 (17) --多租户和SoftDelete
在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...
- 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)
我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...
- 把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel
迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...
- 把旧系统迁移到.Net Core 2.0 日记(5) Razor/HtmlHelper/资源文件
net core 的layout.cshtml文件有变化, 区分开发环境和非开发环境. 开发环境用的是非压缩的js和css, 正式环境用压缩的js和css <environment includ ...
- 把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 (转)
关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...
随机推荐
- hashtable详解
hashtable也比称作哈希表,键值对或者关联数组 1. 先引用using System.Collections;命名空间 用于处理和表现key/value的键值对,其中key通常用来快速查找,同时 ...
- QT---事件系统
1 QT事件系统 1.1 事件的定义 QT中事件是有专门的类QEvent,常见的有键盘事件QKeyEvent.鼠标事件QMouseEvent和定时器事件QTimerEvent.例如用 ...
- top 命令常用操作
1.显示进程参数 top -c 下面操作为top命令后操作 2.按cpu/mem排序 shift + p/m 3.高亮 排序列 按x键 4.高亮 变化进程行 按b键 5.显示cpu每核的运行状态 按1 ...
- python中简单的递归(断点报错的小福利)
首先要先理解什么是递归? 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 下面讲了一个很简单的递归函数 def clac(n): print(n) if int( ...
- HAL无阻塞延时
//实现间隔time_interval时间点亮红灯(此时间间隔并不是绝对的,是大于等于的关系)//用于系统要求无延时且延时时间粗略的场合,比如间隔一段时间采样数据,间隔一段时间点亮状态灯等//HAL_ ...
- Spring Cloud之注册中心搭建
一.注册中心服务端搭建 1)引入相关Maven坐标 <dependency> <groupId>org.springframework.cloud</groupId> ...
- server2008远程开端口的方法
今天在通过本地链接远程oracle数据库的时候发现了个问题,建立好连接了,可是一直没连上,后面发现是防火墙的1521的oracle端口没开启.开启的方法可以采用如下方法: 操作:开始→控制面板→Win ...
- 7 selenium 模块
selenium 模块 一.简介 1.Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. 2.自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接 ...
- 59 Cookie 与 Session
Cookie Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对. 客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie). 当客户端向服务器发出请求时会把所 ...
- Vue音乐项目笔记(四)(搜索页面提取重写)
1.如何通过betterScroll组件实现上拉刷新 https://blog.csdn.net/weixin_40814356/article/details/80478440 2.搜索页面跳转单曲 ...