ASP.NET MVC解决方案中多项目共用现有SQL数据库的配置方法
嘿,这问题我熟!你现在的情况是有个带Individual User Authentication的ASP.NET MVC项目,默认一运行就自动建新数据库,但你想把它和已经存在的那个数据库(就是类库项目里ADO.NET Entity Model用的那个)打通对吧?别担心,跟着下面的步骤来,很快就能搞定:
先找到MVC项目根目录下的Web.config文件,定位到<connectionStrings>节点。默认的DefaultConnection是指向自动生成的LocalDB数据库,你得把它换成现有数据库的连接字符串。
举个例子,原来的默认连接字符串长这样:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-YourMvcProject-20240520123456.mdf;Initial Catalog=aspnet-YourMvcProject-20240520123456;Integrated Security=True" providerName="System.Data.SqlClient" />
把它替换成你类库项目里用的那个连接字符串,比如:
<add name="DefaultConnection" connectionString="Data Source=你的数据库服务器名称;Initial Catalog=你的现有数据库名;Integrated Security=True" providerName="System.Data.SqlClient" />
小贴士:如果类库的连接字符串名称不是
DefaultConnection,要么改成这个名字,要么后面要对应修改DbContext的构造函数参数。
MVC项目里默认有个ApplicationDbContext类(一般在Models文件夹下的IdentityModels.cs或者单独的ApplicationDbContext.cs文件里),它继承自IdentityDbContext<ApplicationUser>,负责Identity相关的数据操作。
默认构造函数是这样的:
public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { }
如果上一步你把连接字符串名称改成了DefaultConnection,这步就不用改;如果用了其他名称,把括号里的字符串替换成你的连接字符串名称就行。
ASP.NET Identity需要一系列表(比如AspNetUsers、AspNetRoles、AspNetUserRoles等)来存储用户、角色信息,你得把这些表添加到现有数据库里,有两种简单方法:
方法一:用Code First迁移(推荐)
- 打开Visual Studio的包管理器控制台(路径:工具 → NuGet包管理器 → 包管理器控制台)
- 确保控制台顶部的“默认项目”选中你的MVC项目
- 先启用迁移(如果还没开的话):
Enable-Migrations -ContextTypeName ApplicationDbContext - 生成创建Identity表的迁移脚本:
Add-Migration InitialIdentityTables - 最后把脚本应用到现有数据库:
Update-Database
放心,Code First迁移只会新增Identity相关的表,不会改动你现有数据库里的其他表。
方法二:手动执行SQL脚本
如果你不想用迁移,也可以手动生成脚本:
- 先让MVC项目默认创建一次临时数据库,然后从这个临时库导出Identity所有表的创建SQL脚本
- 把脚本在你的现有数据库里执行,就能创建出需要的表了
现在启动MVC项目,尝试注册一个新用户,然后打开你的现有数据库,看看AspNetUsers表里是不是多了一条新记录——如果是的话,就说明配置成功啦!
几个要注意的小坑:
- 确保运行MVC项目的账户(比如IIS Express的账户,或者本地调试的Windows账户)有对现有数据库的读写权限
- 如果用SQL Server身份验证,连接字符串里要写对用户名和密码,且该用户有数据库权限
- 要是你想让类库的实体模型和Identity共享同一个DbContext,可以把
ApplicationDbContext改成继承自类库的DbContext,不过这步是可选的,单独用Identity功能的话前面三步就够
内容的提问来源于stack exchange,提问作者Raj

