使用mysql配置asp.net core 1.1.2 + ef core code first及相关坑

asp.net core的好处显而易见
坏处也很明显就是对新人尤其是最近刚发布时候的所有开发者来说
学习曲线太过陡峭而且资料实在太少
各种资料也是歪七硕八太难用或者教了别扭的用法
网上的一些教程确实能连通数据库但写来写去的写法啊都too样
绝大部分教程只适用于asp.net core 1.0甚至standard
这里就把这几天研究到的成果发一下
本文可能不适用于最新的asp.net core 2.0 preview
因为1.0和1.1.2的文件布局及api变化都很大请注意
若有不足欢迎指证
禁止转载、随意转载的司马没丁丁



1、首先准备好mysql及vs2017
2017自带了asp.net core 1.1.2
2015就要注意下vs


2、配置connectionStrings
很多转来转去的教程上把connectionString写在DbContext继承类中的
override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
方法中
我就想问下这么写你们老师知道么?
正确的做法是修改appsettings.json文件
在根级节点添加如下配置
"ConnectionStrings": {
"DefaultConnection": //这里随意定义json key名 "server=localhost;database=test_base;uid=root;pwd=123456;charset=utf8;pooling=true;"
},
无论是mysql还是其它数据库
应自行修改连接字符串内容


3、添加ef及相关包
打开vs菜单上的工具——nuget包管理器
无论通过命令行或管理项目包(第一个和第二个选项)皆可
打开nuget管理器后
添加EntityFrameworkCore包及EntityFrameworkCore.Tools包
添加mysql的相关包Mysql.Data.EntityFrameworkCore preview版(截止目前版本为7.0.7)
添加方法请自行谷哥
前两个是ef的ms官方包不要加错了


4、添加mvc模型及dbcontext继承类
这里简单用User类来做演示
public class User {
[Key]
public int id {get;set;} // 为了数据绑定数据库字段这里必须使用访问器
[Required]
public string name;
}
public class RegisterFormModel {
[Required]
public string name {get;set;} // 为了绑定页面数据这里必须使用访问器
}
AccountController文件中的部分代码


private DbUser userDao;


public AccountController(DbUser dbUser)
{//这里使用了asp.net自带的依赖注入功能、不需要显式new对象
userDao = dbUser;
}
[HttpPost]
public IActionResult register(RegisterFormModel m)
{
if(ModelState.IsValid)
{
User u = new User();
u.name= m.name;
new UserService().register(userDao, u);
return RedirectToAction(nameof(index));
}
else
{
return Content("model.isvalid");
}
最好将业务逻辑从控制器中分离出来
建立单独的UserService类
因为这里只做演示就不处理返回值了
public class UserService
{
public void register(DbUser dbUser, User u)
{
dbUser.addAsync(u);
}
}
关键的UserDbContext类


public class DbUser : DbContext
{
public DbSet<User> users { get; set; }
// 必须使用带参数的构造方法
public DbUser(DbContextOptions<DbUser> options) : base(options)
{// 检测数据库中是否存在该库及表、若用现有的库则不会创建表、导致后面save时报错
Database.EnsureCreated();
}


protected override void OnModelCreating(ModelBuilder modelBuilder)
{// 这里用来重命名表名、ef 6时代使用的[Table("table_name")]注解好像没用了、求验证
modelBuilder.Entity<User>().ToTable("sys_user");
}


public void addAsync(User u)
{
users.Add(u);
SaveChanges();
}
}
html就不放了
保证input标签中name字段与model类中的字段名一致即可


5、修改startup.cs配置代码
在void ConfigureServices(IServiceCollection services)方法中添加如下代码及相关引用
string connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddEntityFrameworkMySQL();
services.AddDbContext<DbUser>(options => options.UseMySQL(connectionString));
这才是正确姿势好嘛
在每个dbcontext继承类里实现onConfiguration方法是什么鬼


至此所有流程全部走完了(应该
部署并运行项目提交表单后
应该就能看到数据库中生成了新库及新表并插入数据了
以下说几个一直被搞糊涂的坑


1、powershell问题
1、1 新表添加
部分教程教你使用Add-Migrate指令去在数据库中添加表或做迁移
做迁移或许可以这么用但新项目新表绝对不应该这么麻烦
区区一个code first应该上手简便不应该这么复杂
应该至少与ef 6保持同步
即没有新表的时候会自动根据映射类生成
1、2 版本问题
某天早上醒来后就发现powershell里的一些指令不能用了
报错无法在powershell 2.0上使用指令
包括上面的Add-Migrate会报这样的错
那么下一个吧下完4.0装好后
发现指令直接没了
还有Update-Database
好像都直接移除了
也不知道是移除了还是对应版本的指令没有装
反正很麻烦


2、nuget版本管理问题
nuget本来是个好东西
但是asp.net core一出来就搞了这么多东西
又是nuget又是bow让新人完全没法接受
而且版本兼容不好做
新人下了包之后版本不对都不知道怎么删
core 1.0(preview?)时的删除不仅可以通过删除右侧的依赖项右键删除
还能在项目根目录下的project.json(好像是这个名字)配置文件中删除
vs会自动检测并动态移除
到了1.1.2之后看到包冲突都傻了
依赖项分开了core依赖和nuget依赖
真是复杂啊


3、session做成了中间件
这个只能自己去额外下官方session中间件了
我觉得应该一开始就配置上去但可以作为中间件移除
不然一开始接触的人发现session都用不了简直一头雾水
加完了还得在Startup.cs文件的
void ConfigureServices(IServiceCollection services)
方法中添加语句
services.AddSession();
才能启用


总而言之能够有asp.net core新框架
趁早把java这破船给打爆轰沉
让码农能从繁重的体力劳动中解除出来

楼主 神宫寺铃香  发布于 2017-06-10 12:44:00 +0800 CST  
最后别忘了在跑项目前启动数据库

楼主 神宫寺铃香  发布于 2017-06-10 12:45:00 +0800 CST  

楼主:神宫寺铃香

字数:3396

发表时间:2017-06-10 20:44:00 +0800 CST

更新时间:2021-02-22 18:52:10 +0800 CST

评论数:15条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看