Retrofit2对接ASP.NET+SQL Server:重建项目后数据丢失求助
解决ASP.NET重建后数据回滚的问题
老兄,你遇到的这个问题我之前帮好几个开发者排查过,大概率是数据库文件复制配置或者EF初始化策略搞的鬼,咱们一步步来解决:
1. 先查本地.mdf文件的复制属性
如果你的ASP.NET项目用的是App_Data里的本地SQL Server Express数据库(.mdf文件),先右键项目里的这个.mdf文件,打开属性面板:
- 找到「复制到输出目录」这个选项,默认可能是「始终复制」或者「如果较新则复制」
- 问题核心就在这:每次你重建项目,Visual Studio都会把项目根目录里那个带初始数据的原始.mdf文件,复制到bin目录覆盖掉你之前更新过的数据库文件!你用PUT更新的其实是bin目录里的数据库,重建后直接被原始文件替换,调用GET时读的是新复制的原始数据,看起来就像回滚了。
解决办法:
把「复制到输出目录」改成「不复制」;如果确实需要保留初始数据,就改成「如果较新则复制」——但注意之后要是修改初始数据,得改项目根目录里的那个.mdf文件才行。
2. 检查Entity Framework的初始化策略
要是你用了EF,得看看你的DbContext是不是配置了自动重置数据库的策略:
- 打开你的DbContext类,或者Startup.cs/Global.asax里的初始化代码,有没有类似这样的代码:
Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContext>());
或者DropCreateDatabaseIfModelChanges,甚至CreateDatabaseIfNotExists加上种子数据,这些策略会在项目启动(重建后第一次运行)时重置数据库,把数据打回初始状态。
解决办法:
- 要是不需要自动重置数据库,直接把初始化策略设为null:
Database.SetInitializer<YourDbContext>(null);
- 推荐用
MigrateDatabaseToLatestVersion配合Code First迁移,这样只会更新数据库结构,绝对不会动你已经写入的数据。
3. 确认PUT接口的事务/保存逻辑没问题
虽然你说Postman操作也有问题,但还是得确认下你的API代码有没有正确提交数据:
- 检查EF代码里是不是调用了
SaveChanges()?没调用的话,数据根本没写到数据库里。 - 如果用了手动事务,有没有调用
Commit()?会不会有异常导致事务自动回滚?
4. 核对连接字符串指向的数据库
有时候你以为改的是A数据库,结果代码连的是B数据库:
- 打开Web.config里的连接字符串,看
Data Source和AttachDbFilename(如果是本地文件)是不是你实际查看的那个? - 比如
|DataDirectory|在运行时指向的是bin目录下的App_Data,不是项目根目录的App_Data!你在SSMS里看的可能是根目录的.mdf,但代码操作的是bin里的,重建后bin里的被覆盖,自然数据就没了。
举个典型的坑连接字符串:
<connectionStrings> <add name="YourDbContext" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\YourDatabase.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
最后验证步骤
改完配置后按这个流程测:
- 删除bin目录下的.mdf和.ldf文件
- 运行项目,用PUT更新数据
- 重建ASP.NET项目,再调用GET接口,看看数据是不是保留住了
内容的提问来源于stack exchange,提问作者Khanh Chi Phung
相关产品推荐
相关产品推荐

