【问题标题】:Adding Mutliple Row Effected properly but not Updating (C#, Entity Framework 6)正确添加受影响但不更新的多行(C#,实体框架 6)
【发布时间】:2017-11-09 23:32:37
【问题描述】:

如下所示,我正在尝试更新“活动”和“版本”字段,它们是 templateData 对象的属性。

当我想添加一条新记录时,它可以正常工作并满足需求。但是当我尝试更新 state.modified 行时,错误是:

附加类型为“...”的实体失败,因为另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体并且尚未收到数据库生成的键值。在这种情况下,使用 'Add' 方法或 'Added' 实体状态来跟踪图形,然后将非新实体的状态适当地设置为 'Unchanged' 或 'Modified'。

虽然我尝试了很多崩溃的方法(如你所见),但我没有成功。

这个错误的原因是什么?我该如何处理呢?

感谢您的帮助。

服务:

public ResultObject<TemplateData> SaveTemplateData(TemplateData oTemplateData)
    {
        var oResult = new ResultObject<TemplateData>();

        using (var contextTransaction = _context.Database.BeginTransaction())
        {
            try
            {
                var listTempDatas = _context.TemplateDatas.Where(td => td.TemplateRID == oTemplateData.TemplateRID)
                    .ToList();

                #region active/version

                oTemplateData.Active = true;

                if (listTempDatas.Count > 0)
                {
                    #region resetActives
                    listTempDatas.ForEach(ltd => ltd.Active = false);
                    #endregion

                    #region getMaxVersion

                    var maxVersionValue = listTempDatas.Max(ltd => ltd.TemplateVersion);
                    //var maxVersionValue2 = listTempDatas.OrderByDescending(ltd => ltd.TemplateVersion).Select(ltd => ltd.TemplateVersion).First();

                    oTemplateData.TemplateVersion = maxVersionValue + 1;

                    #endregion
                }
                else if (listTempDatas.Count == 0)
                {
                    oTemplateData.TemplateVersion = 1;
                }

                #endregion

                if (oTemplateData.ID > 0)
                {
                    var oldTempData = _context.TemplateDatas.AsNoTracking()
                        .FirstOrDefault(td => td.ID == oTemplateData.ID);
                    if (oldTempData != null)
                        _context.Entry(oTemplateData).State = EntityState.Modified;// and there it is
                }
                else if (oTemplateData.ID == 0)
                {
                    _context.Entry(oTemplateData).State = EntityState.Added;
                }

                _context.SaveChanges();

                oResult.ResulObject = oTemplateData;
                contextTransaction.Commit();
            }
            catch (Exception e)
            {
                contextTransaction.Rollback();
                oResult.AddError("TemplateService.SaveTemplateData", e.ToString());
            }
        }

        return oResult;
    }

实体:

public class TemplateData
{
    ...

    public int ID { get; set; }

    public int? TemplateRID { get; set; }

    ...

    public int? TemplateVersion { get; set; }

    public bool? Active { get; set; }

    ...

    public virtual Template Template { get; set; }
}

DataContextExtension:

public static ApplicationDbContext BulkInsert<T>(this ApplicationDbContext context, T entity, int count,
        int batchSize) where T : class
    {
        context.Set<T>().Add(entity);

        if (count % batchSize == 0)
        {
            context.SaveChanges();
            context.Dispose();
            context = new ApplicationDbContext();

            // This is optional
            context.Configuration.AutoDetectChangesEnabled = false;
        }
        return context;
    }

【问题讨论】:

    标签: c# sql linq entity-framework-6 crud


    【解决方案1】:

    问题在于这条线

    var listTempDatas = _context.TemplateDatas.Where(td => td.TemplateRID == oTemplateData.TemplateRID)
        .ToList();
    

    已经在上下文中加载(跟踪)您尝试更新的现有实体。

    所以首先你可以尝试在该列表中找到它(而不是使用单独的数据库查询):

    var oldTempData = listTempDatas.FirstOrDefault(td => td.ID == oTemplateData.ID);
    

    然后简单地更新现有实体的属性,而不是尝试将分离的实体标记为已修改:

    if (oldTempData != null)
        _context.Entry(oldTempData).CurrentValues.SetValues(oTemplateData); // and there you go
    

    【讨论】:

    • 非常感谢您的及时和翔实的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多