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

本文介绍了如何在ASP.NET Core 1.1.2中使用EF Core连接MySQL数据库,包括配置ConnectionStrings、添加相关包、创建数据库上下文、模型以及依赖注入,并提醒读者注意一些常见问题,如PowerShell版本、NuGet版本管理和Session中间件的设置。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

asp.net core的好处显而易见

坏处也很明显就是对新人尤其是最近刚发布时候的所有开发者来说

学习曲线太过陡峭而且资料实在太少

各种资料也是歪七硕八太难用或者教了别扭的用法

网上的一些教程确实能连通数据库

628be2a1ea0e16d6fec9b7ad2c3eb48a.gif但写来写去的写法啊都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 users { get; set; }

// 必须使用带参数的构造方法

public DbUser(DbContextOptions options) : base(options)

{// 检测数据库中是否存在该库及表、若用现有的库则不会创建表、导致后面save时报错

Database.EnsureCreated();

}

protected override void OnModelCreating(ModelBuilder modelBuilder)

{// 这里用来重命名表名、ef 6时代使用的[Table("table_name")]注解好像没用了、求验证

modelBuilder.Entity().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(options => options.UseMySQL(connectionString));

这才是正确姿势好嘛

在每个dbcontext继承类里实现onConfiguration方法是什么鬼

至此所有流程全部走完了(应该

fc4c1c52f1a86bdc6ffe9a6704cf7f80.gif

部署并运行项目提交表单后

应该就能看到数据库中生成了新库及新表并插入数据了

以下说几个一直被搞糊涂的坑

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这破船给打爆轰沉

让码农能从繁重的体力劳动中解除出来

fc4c1c52f1a86bdc6ffe9a6704cf7f80.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值