zoukankan      html  css  js  c++  java
  • EF中附加已经存在的实体的方法。

    一、错误

    EF中附加类型“**”的实体失败,因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为。这可能是因为某些实体是新的并且尚未接收数据库生成的键值。在此情况下,使用 "Add" 方法或者 "Added" 实体状态跟踪该图形,然后将非新实体的状态相应设置为 "Unchanged" 或 "Modified"。

    二、错误原因

    1.直接使用了查询出来的实体,然后附加,可能出现此问题,

    解决办法:在查询语句中添加.AsNoTracking()(即查询结果上下文不进行跟踪);如 DbContext.Set<T>().AsNoTracking();

    2.在使用  DbContext.Entry<T>(t).State = EntityState.Modified; 使用 EntityState.Modified后会自动跟踪实体,如果再次附加也会出现此问题。

    解决办法:

    直接查找上下文中是否存在此实体,如果存在则移除,然后再进行操作,此方法在大部分情况下有效。

    /// <summary>
    /// 如果上下文中存在对象则移除
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    public bool Exists(T entity)
    {
    ObjectContext _ObjContext = ((IObjectContextAdapter)DbContext).ObjectContext;
    ObjectSet<T> _ObjSet = _ObjContext.CreateObjectSet<T>();
    var entityKey = _ObjContext.CreateEntityKey(_ObjSet.EntitySet.Name, entity);

    Object foundEntity;
    var exists = _ObjContext.TryGetObjectByKey(entityKey, out foundEntity);
    // TryGetObjectByKey attaches a found entity
    // Detach it here to prevent side-effects
    if (exists)
    {
    _ObjContext.Detach(foundEntity);
    }
    return (exists);
    }

  • 相关阅读:
    QT实现软件重启
    Qt 延时
    gcc 创建库及使用
    verilog 奇数分频设计
    内核中的 likely() 与 unlikely()
    TFT LCD 参数详解
    手动安装m4, autoconf, automake, libtool
    [其他] 蒙特卡洛(Monte Carlo)模拟手把手教基于EXCEL与Crystal Ball的蒙特卡洛成本模拟过程实例:
    Origin9.1如何绘制风向玫瑰图(Binned Data)?
    Origin9.1如何使用原始数据(Raw Data)绘制风向玫瑰图
  • 原文地址:https://www.cnblogs.com/liulingwei/p/6407891.html
Copyright © 2011-2022 走看看