none
EF断开连接或者分布式应用无法自跟踪实体状态如何解决的? RRS feed

  • 问题

  • 刚刚学习EF不久,有些问题还不懂,自己摸索。

    问题是这样,如果数据层DbContext使用单一实例(不关闭连接吧)方式,那么读取数据,更改后写回,是能跟踪到传回的数据状态的。但这种一直不关闭连接,使用单一实例的DbContext似乎是不好的吧。而且如果在分布式应用,我想也不可能一直保持着连接的。所以,获取数据改为:

    public static List<T> GetEntiyToList<T>(string Filter = "") where T : class
            {
                using (var ctx = new ERPContext())
                {
                    return ctx.Set<T>().ToList();
                }
            }

    而回传数据,保存代码无法通过这种方式:

    public static void SaveEntity<T>(T entity) where T : class

    {

    var state = ctx.Entry(entity).State; if (state == EntityState.Unchanged) ctx.Entry(entity).State = EntityState.Modified; else if (state == EntityState.Detached) ctx.Set<T>().Add(entity);

    }

    因为Using方式,使用完就关闭了,所以再传回的全部是Detached,保存会提示更新条目出错......。所以改为查找实体是否有相同主键的,如果有则修改值,并更新,没有则添加:

    public static void SaveEntity<T>(T entity) where T : class
            {
                using (var ctx = new ERPContext())
                {
                    object[] keyvalue = GetKeyValues(entity);
                    var ExistsEntity = ctx.Set<T>().Find(keyvalue);
                    if (ExistsEntity == null)
                    {
                        ctx.Set<T>().Add(entity);
                    }
                    else
                    {
                        var props = ExistsEntity.GetType().GetProperties();
                        foreach (var p in props)
                        {
                            foreach (var p1 in props)
                            {
                                if (p1.Name == p.Name && p1.GetValue(entity) != p.GetValue(ExistsEntity))
                                    p.SetValue(ExistsEntity, p1.GetValue(entity));
                            }
                        }
                    }
                    ctx.SaveChanges();
                }
            }

    另外删除实体我是单独一个方法,传回删除的实体,进行删除:

     public static void DeleteEntity<T>(T entity) where T : class
            {
                using (var ctx = new ERPContext())
                {
                    ctx.Set<T>().Remove(entity);
                    ctx.SaveChanges();
                }
            }
    这样确实能解决了问题,但不知这样是否是正确的方式?

     

    陈锦巍

    2019年6月13日 15:25

全部回复

  • Hi,

    有关断开连接的实体,这里有一篇官方文档你可以参考一下。

    使用断开连接的实体

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年6月18日 9:40
  • 好的,研究一下,谢谢!

    陈锦巍

    2019年6月21日 8:12