【发布时间】:2019-03-14 21:52:21
【问题描述】:
当我尝试插入/更新记录时,出现以下错误。
无法跟踪实体类型的实例,因为另一个实例 {'Id'} 具有相同键值的已被跟踪。
下面是我的代码。在这里,我以 1 为增量创建/生成 ID(主键)。我在保存和更新时都遇到错误
public bool SaveDataCapDetails(List<TDataCapDetails> lstDataCapDetails)
{
bool IsSuccess = false;
using (var dbContextTransaction = _objContext.Database.BeginTransaction())
{
try
{
List<TDataCapDetails> lstDataCapDetailsRecords = null;
if (lstDataCapDetails.Where(x => x.Id == 0).Count() > 0)
{
lstDataCapDetailsRecords = new List<TDataCapDetails>();
lstDataCapDetailsRecords.InsertRange(0, lstDataCapDetails);
int? id = _objContext.TDataCapDetails.Max(x => (int?)x.Id);
id = id == null ? 0 : id;
foreach (var item in lstDataCapDetailsRecords.Where(x => x.Id == 0))
{
id = id + 1;
item.Id = (int)id;
}
_objContext.Entry(lstDataCapDetailsRecords).State = EntityState.Detached;
_objContext.AddRange(lstDataCapDetailsRecords);
_objContext.SaveChanges();
}
if (lstDataCapDetails.Where(x => x.Id > 0).Count() > 0)
{
lstDataCapDetailsRecords = new List<TDataCapDetails>();
lstDataCapDetailsRecords = lstDataCapDetails.Where(x => x.Id > 0).ToList();
_objContext.UpdateRange(lstDataCapDetailsRecords);
_objContext.SaveChanges();
}
dbContextTransaction.Commit();
}
catch (Exception ex)
{
dbContextTransaction.Rollback();
throw ex;
}
}
return IsSuccess;
}
我从下面的业务层调用上述方法
bool success = dal.SaveDataCapDetails(lstDataCapDetails)
我已尝试使用 AsNoTracking 和其他可用选项,但仍无法解决此问题。
对此的任何帮助表示赞赏。
【问题讨论】:
-
听起来你需要使用
Attach()。我不确定你是否可以使用_objContext.Attach(lstDataCapDetails),但至少你应该附加到现有的_objContext并设置HasIndex()和IsUnique()以获得任何唯一索引。 -
好的..你能发布示例代码吗,或者如果你可以在我现有的代码中修改就可以了
-
@AmirReza-Farahlagha 同意但我没有从数据库中获取任何值并存储在对象中。我实际上是在将我的对象从业务层传递给 DAL。
-
@XamDev 你在你的表的数据库中设置了身份增加吗??
-
Nope..我正在从代码中设置主键..你可以看到Id的增量
标签: c# entity-framework linq asp.net-core