添加多行有效但未更新(C#、实体框架 6)

文学作家

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

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

附加类型为“...”的实体失败,因为另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“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; }
}

数据上下文扩展:

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;
    }
伊万·斯托耶夫

问题是这条线

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架6更新图

来自分类Dev

实体框架代码优先迁移在EF5中有效,但在EF6中无效

来自分类Dev

实体框架6添加外键

来自分类Dev

实体框架6从DbContext加载有效,但在上下文包装程序中相同的加载不起作用

来自分类Dev

实体框架6 + SQLSpatialFunctions

来自分类Dev

带有Npgsql的实体框架6

来自分类Dev

实体框架6添加/更新-编辑时出错,并尝试将编辑后的实体添加为新实体

来自分类Dev

实体框架6添加/更新-编辑时出错,并尝试将编辑后的实体添加为新实体

来自分类Dev

将实体添加到表的通用函数-实体框架6和C#

来自分类Dev

实体框架6-如何添加子实体?

来自分类Dev

实体框架6-添加带有其他子项的子项的父项

来自分类Dev

实体框架6更新,带有必需的复杂属性验证错误

来自分类Dev

SQLite和实体框架6

来自分类Dev

实体框架6和集合

来自分类Dev

实体框架6防止删除

来自分类Dev

实体框架6和集合

来自分类Dev

实体框架6和oracle

来自分类Dev

实体框架 6 多对多

来自分类Dev

C#Moq实体框架6数据上下文添加操作

来自分类Dev

C#Moq实体框架6数据上下文添加操作

来自分类Dev

实体框架6-ASP.NET筛选器-并发添加

来自分类Dev

实体框架6:添加总计的摘要行

来自分类Dev

实体框架6-无法更新表中的单个列

来自分类Dev

实体框架6中的更新而无需往返

来自分类Dev

无法更新实体框架6中的外键

来自分类Dev

实体框架6-无法更新表中的单个列

来自分类Dev

在实体框架中多对多插入/更新6可联接

来自分类Dev

实体框架6更新,其中外键引用NULL

来自分类Dev

实体框架 6 手动更新记录