You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

最后验证步骤

改完配置后按这个流程测:

  1. 删除bin目录下的.mdf和.ldf文件
  2. 运行项目,用PUT更新数据
  3. 重建ASP.NET项目,再调用GET接口,看看数据是不是保留住了

内容的提问来源于stack exchange,提问作者Khanh Chi Phung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:12:48