向数据库添加多份仅改属性的同对象记录失败问题咨询
问题原因分析与解决办法
兄弟,我一眼就瞅出你这问题的根源了!
问题出在哪?
你在循环里写的MyClass NewObject=obj;是引用类型的赋值——C#里类属于引用类型,这行代码根本没创建新对象,NewObject和传入的obj其实是同一个实例的两个“别名”而已!
第一次循环时,你把这个实例添加到DbContext,EF会给它分配主键id,并把它标记为“已跟踪”的实体。后续循环里,你修改的还是这个已经被EF跟踪的实例,EF会认为你是要更新这条已存在的记录,而不是新增,自然就没法成功添加多条了。
解决办法:每次循环创建全新的实例
要解决这个问题,你需要在每次循环里都创建一个MyClass的新实例,然后把原obj的属性(除了id)复制过去,再添加到DbContext。
修正后的代码示例
public ActionResult Test(MyClass obj, int Counter) { for(int i = 0; i < Counter; i++) { // 创建全新的MyClass实例,手动复制需要的属性 MyClass newObject = new MyClass { name = $"{obj.name} {i}", // 用字符串插值更简洁 color = obj.color, // 把obj的其他属性都复制过来,注意不要复制id! // 如果你的id是自增主键,让它保持默认值(int默认0)即可 }; // 将新实例添加到DbContext Db.MyClasses.Add(newObject); } // 批量保存所有新增的记录(比循环里每次Save更高效) Db.SaveChanges(); return View(); }
额外注意事项
- 确保新实例的
id是默认值:如果你的id是数据库自增主键,不要把原obj的id复制过来,让新实例的id保持0(int类型默认值),EF才会识别这是一个需要新增的实体。 - 批量保存更高效:尽量不要在循环里每次都调用
SaveChanges(),可以把所有新实例都添加到DbContext后,最后统一调用一次,减少数据库交互次数。
内容的提问来源于stack exchange,提问作者İyad Mansür
相关产品推荐
相关产品推荐

