EntityFramework中Code First不能建立数据库的问题解决

最近在弄一个webgis的项目,其中一个重要功能是在ASP.Net Web中通过Code First建立数据库。最初已经做出了个雏形出来,能够成功建库,后面对数据库字段不满意就直接在文件夹里把库给删了,这就是悲剧的开始。。。

等我把字段改满意了重新运行程序的时候,就出现了下面这个连续困扰我很多天的Bug。stackoverflow上看到有个哥们说它是"nasty error",我非常赞同(=。=)
在这里插入图片描述
其实图片里的第一个异常算是个幌子,我上网搜了很久也没找到有帮助的资料。反而是查第二个异常的时候,得到了很多灵感,解决了这个问题:

Cannot attach the file ‘{0}’ as database '{1}'
其中{0}里面是完整的数据库路径(appconfig文件里的connetstring中写的路径,导致我一度以为是连接字符串出了问题),{1}里面是数据库名。

先说结论吧,这个错误是数据库没删干净导致的。对我帮助最大的是这篇帖子,里面说"If you delete the DB file, it still stays registered with SqlLocalDB."

https://stackoverflow.com/questions/13275054/ef5-cannot-attach-the-file-0-as-database-1

下面具体记录一下我的解决过程。上面这篇帖子里前两种方法应该都是可以的(点赞数前二),我用的是第一种。

所用环境是VS 2019(.Net版本是4.7.2);数据库用的是SQL Server 2019。

第一步:重置数据库实例

这一步应该不止一种方法,但我查到的资料里都是通过LocalDB进行的,比较方便。关于LocalDB的介绍可以看这两篇博客,写得很详细。我自己在VS安装了但没什么用,在官网安装后就好了。

https://www.cnblogs.com/Grande/p/10002123.html
https://zhuanlan.zhihu.com/p/53088056

SQL Server默认的实例为 MSSqlLocalDb,之前的错误操作都是在这上面进行的。我们要做的就是将这个实例删除,再重新创建出来,就可以掩盖掉之前的愚蠢操作了hhh。

下载好LocalDB后,找到开始菜单/VS文件夹/Developer Command Prompt for VS,用管理员身份打开,依次使用下面的代码,便可完成实例的重置。
需要注意的是,旧版本的LocalDB使用的都是v11.0之类的实例名(这个是SQL Server2012),新版本,至少2014年至今,用的都是MSSqlLocalDb。

sqllocaldb stop MSSqlLocalDb		# 停止服务
sqllocaldb delete MSSqlLocalDb		# 删除实例
sqllocaldb c MSSQLLocalDB		# 创建实例
sqllocaldb s MSSQLLocalDB		# 运行实例

第二步:重置端口

上一步其实已经完成一大半工作了,乱删数据库的错误基本得到了弥补。但是重新运行程序,会跳出警告窗口:

id 为XXXXX的进程当前未运行

随便查查就能知道原因,这是localhost端口被占用导致的,就是web正常运行时在地址栏看到的那个。在VS里右击项目名,进入属性/Web,就能在项目url一栏看到目前的端口,我的是9270:
在这里插入图片描述
端口占用要怎么解决呢?我看网上有大兄弟说直接手动改成一个不被占用的就行,真想请教一下他们怎么改的,或者我运气太差,改了十多个也不行(=。=)。

查到了一个相关的博客,我自己看不太懂,自然也没用这种方法,有兴趣的朋友可以看看:

https://blog.csdn.net/he13733625052/article/details/105026714?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162554327616780265467602%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162554327616780265467602&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-105026714.first_rank_v2_pc_rank_v29&utm_term=localhost%E7%AB%AF%E5%8F%A3%E5%8D%A0%E7%94%A8%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3&spm=1018.2226.3001.4187

我自己用的是下面这个方法,很暴力,但亲测有效。原理应该是把现有端口数据直接删掉,把找端口的工作甩给程序。

https://www.cnblogs.com/luna-hehe/p/10982616.html

按博客所说删掉WebProjectProperties中间的内容,重新运行,我的VS installer居然跳出来了,重新安装了一遍.Net Framework。。。不过好在安装过后数据库可以正确建立了,网站也能顺利运行了~~

总结

千万不要随便在文件夹里删数据库!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值