添加多行数据时遇Id属性不可修改错误的技术求助
问题排查与解决
错误原因
你在foreach循环外部创建了TblCariAdres实例,第一次循环执行Db.TblCariAdres.Add(tblCariAdres)和Db.SaveChanges()后,EF上下文已经开始跟踪这个实体对象。第二次循环时,你试图修改这个已被跟踪实体的主键Id(主键属于对象的关键标识信息,EF不允许修改已跟踪实体的主键),因此触发了报错:The property 'Id' is part of the object's key information and cannot be modified.
修复方案
将TblCariAdres的实例创建逻辑移到foreach循环内部,每次循环都生成一个全新的实体对象,确保每次添加的都是未被EF跟踪的新实例:
if (tblCari.TblCariAdres.Count != 0) { foreach (var item in tblCari.TblCariAdres) { // 每次循环创建新的实体实例 TblCariAdres tblCariAdres = new TblCariAdres(); tblCariAdres.Id = Guid.NewGuid(); tblCariAdres.FirmaId = tblCari1.FirmaId; tblCariAdres.CariId = tblCari1.Id; tblCariAdres.Tanim = item.Tanim; tblCariAdres.Isim = item.Isim; tblCariAdres.Adres = item.Adres; tblCariAdres.Ilce = item.Ilce; tblCariAdres.Sehir = item.Sehir; tblCariAdres.Telefon = item.Telefon; tblCariAdres.Aciklama = item.Aciklama; Db.TblCariAdres.Add(tblCariAdres); } // 所有实体添加完成后统一保存,减少数据库交互次数 Db.SaveChanges(); }
额外优化
把Db.SaveChanges()移到循环外部,避免每次循环都执行一次数据库写入操作,能显著提升批量数据添加的性能。
内容的提问来源于stack exchange,提问作者Ünal Karaarslan
相关产品推荐
相关产品推荐

