ASP.NET MVC视图数据存入数据库异常:图片保存报错
问题解决思路
你遇到的「Store update, insert, or delete statement affected an unexpected number of rows (0)」错误,核心原因是EF尝试操作的实体不存在,或被误当成更新操作而非新增。以下是具体排查和解决步骤:
1. 检查BLL层AddMovie方法的实现
确保方法逻辑是新增实体,而非更新。如果你的BLL代码是类似下面的错误写法,会把新的Movie对象当成已有实体去更新,从而触发错误:
// 错误写法:误用Update操作 public void AddMovie(Movie movie) { dbContext.Movies.Update(movie); dbContext.SaveChanges(); }
需改为新增逻辑:
// 正确写法:执行新增操作 public void AddMovie(Movie movie) { dbContext.Movies.Add(movie); dbContext.SaveChanges(); }
因为新创建的Movie还未生成主键值,用Update会让EF认为你要更新一个不存在的实体,最终抛出影响行数为0的错误。
2. 验证Movie实体的主键配置
如果Movie的主键是自增类型(比如int Id),必须确保实体类或Fluent API中配置了自增规则:
- 实体类标记特性:
public class Movie { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } // 其他字段 public byte[] Image { get; set; } }
- 或Fluent API配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Movie>() .Property(m => m.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); }
若未开启自增,EF会要求手动赋值主键,否则插入时会因主键为空/重复失败,触发相同错误。
3. 优化控制器的图片处理代码(可选)
你原有的图片读取逻辑可以简化,无需判断MemoryStream类型,直接读取即可:
[HttpPost] public ActionResult AddMovie(Movie movie, HttpPostedFileBase Image) { if (Image != null && Image.ContentLength > 0) { using (var memoryStream = new MemoryStream()) { Image.InputStream.CopyTo(memoryStream); movie.Image = memoryStream.ToArray(); } } else { movie.Image = null; } if (ModelState.IsValid) { obllmovie.AddMovie(movie); return RedirectToAction("Index"); } return View(); }
4. 检查视图与ModelState有效性
确保视图中没有意外给Movie的主键字段赋值(比如误加了绑定Id的隐藏域),同时确认其他必填字段都正确输入,保证ModelState.IsValid为true,否则新增逻辑不会执行。
内容的提问来源于stack exchange,提问作者StefanIulian
相关产品推荐
相关产品推荐

