问题如题
现在很多时候,即使是.net项目,我们用的数据库也未必时是 SQL Server了。
但很多VS 自带的框架(如MVC 、WebAPI等框架)中的示例自带的仍然是默认Sql Server的,而且并不一定好改成别的数据库。这有时候就很苦恼。
比如.net MVC框架中自带的一套用户体系,含有用户登录注册权限角色等一大堆的功能。如果我们开始一个新项目,不得不使用Sql Server以外的数据库的化,而且又没有足够的成本来重新开发一套权限管理机制的话,那我们要怎么办呢?
自己仓促写的通常又太low,也不怎么安全。
套用别的又很麻烦。
而实际上,这种情况在我的工作经历中一直持续发生,到现在我也没能成功地运用好VS .net框架中自带的那一套权限体系,每次都自己开发,但又觉得有点low。
痛定思痛啊,这篇博文就是为了解决这个问题。
这里面提供两种思路和方案。
经尝试,就算我最终在web.config里面把mysql的配置好,项目可以启动,但注册和登录等需要读写数据库的时候还是会出错。
原因很简单,sql server的话,可以直接创建数据库和表,毕竟是自家亲儿子。
别的数据库,比如mysql,就无法创建数据库和表,也就失败了。
table XXX not existed的错误提示很明显了。
于是我就想到了一种低级一点的办法,事实证明,好理解,也有效。
1.低级一点的。
手工按照.net框架里要的那样,建好一个数据库和表,以及对应字段。
如图:
那么你又要问,到底是什么结构呢? 这多麻烦啊
我的办法是:
用VS新建一个MVC项目,然后就简单粗暴运行,注册等。此时会发现已经有sql server数据库和表生成了。
如图
“视图” – sql server对象管理器“
然后,
依次获得到各个table的创建语句
然后就可以看到打开的sql文件里的类似如下的sql语句片段:
USE [aspnet-WebApplication4-20180326090819]
GO
/****** 对象: Table [dbo].[AspNetRoles] 脚本日期: 2018/3/27 11:46:34 ******/
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetRoles] ( [Id] NVARCHAR (128) NOT NULL, [Name] NVARCHAR (256) NOT NULL );
GO
CREATE UNIQUE NONCLUSTERED INDEX [RoleNameIndex] ON [dbo].[AspNetRoles]([Name] ASC);
GO
ALTER TABLE [dbo].[AspNetRoles] ADD CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ([Id] ASC);
可以用来创建mysql中的表吗?
机智哦
不过直接粘贴过去执行还是会报错的,毕竟是不同的数据库,数据类型、语法什么的还是有些不一样。
我们就取其中的
CREATE TABLE [dbo].[AspNetRoles] ( [Id] NVARCHAR (128) NOT NULL, [Name] NVARCHAR (256) NOT NULL );
创建表的这句话去mysql中建表就行了。
再相应修改一下:
CREATE TABLE AspNetRoles ( Id VARCHAR (128) NOT NULL, Name VARCHAR (256) NOT NULL );
如上,我去掉了dbo,去掉了中括号,NVARCHAR改为VARCHAR。
然后在mysql中执行,真的就成功了。
所以,另外的几个表,以此类推,在mysql中就可以得到几个表,结构和字段与sql server中的都一致了。
这些我已经亲测了,确实成功。
而且后续的运行,注册,登录等都可以成功。
不再赘述。
总之,这里算是耍了个滑头。
但也算是解决了问题,毕竟能用。
但上述方法真的好勉强啊。
问题的关键其实很简单,就是在现有代码条件下,mysql没法直接就创建了mysql table这些东西。
如果能呢,那岂不是很好?
这也就是我后来终于找到的
2. 高级一点的做法
我本机的环境:
windows 10 64bit
Visual Studio 2015 旗舰版,.NET 4.5.2,
Mysql 5.7.17 社区版。
按照博文中的配置好之后,直接运行成功,一字不改。
而且注册登录都成功写入数据库。
完全仿照这个做完就好了。