【问题标题】:Entity Framework - Attaching Entities - Attach Navigation Properties?实体框架 - 附加实体 - 附加导航属性?
【发布时间】:2013-05-07 13:02:44
【问题描述】:

我有以下通用代码来更新断开连接的实体:

public T UpdateItem(T entity)
{
    this._dbSet.Attach(entity);
    this._dbContext.Entry(entity).State = System.Data.EntityState.Modified;

    this._dbContext.SaveChanges();

    return entity;
}

如果我的实体包含导航属性,这些属性不会被附加并设置为已修改。有没有办法可以更改此通用方法以附加并设置为已修改的所有导航属性?

【问题讨论】:

    标签: entity-framework entity-framework-5


    【解决方案1】:

    你可以通过反射来做到这一点。这是查找所有相关集合的扩展方法。如果您的所有实体都实现了一些标准接口,您将能够使用类似的方法来查找非集合导航属性(实现您的接口)。

    public static class ContextExtensions
    {
        public static IEnumerable<IEnumerable<dynamic>> GetCollections(this object o)
        {
            var result = new List<IEnumerable<dynamic>>();
            foreach (var prop in o.GetType().GetProperties())
            {
                if (typeof(IEnumerable<dynamic>).IsAssignableFrom(prop.PropertyType))
                {
                    var get = prop.GetGetMethod();
                    if (!get.IsStatic && get.GetParameters().Length == 0)
                    {
                        var enumerable = (IEnumerable<dynamic>)get.Invoke(o, null);
                        if (enumerable != null) result.Add(enumerable);
                    }
                }
            }
            return result;
        }
    }
    

    这应该添加当前对象的导航属性

    var collections = entity.GetCollections();
    foreach (var collection in collections)
    {
        foreach (var r in collection)
        {
            if (_this._dbSet.Entry(r).State == System.Data.EntityState.Detached)
            {
                this._dbSet.Attach(r);
                this._dbContext.Entry(r).State = System.Data.EntityState.Modified;
            }
        }
    }
    

    【讨论】:

    • 我很少使用dynamic,但我有点惊讶typeof(IEnumerable&lt;dynamic&gt;).IsAssignableFrom 是有效的。这本质上是解析为IEnumerable&lt;object&gt;,还是在评估期间神奇地将动态替换为prop.PropertyType
    • GetCollections 返回我没有看到的嵌套枚举是否有原因?
    • 我想这只是返回集合而不是集合中的实体,尽管在这种情况下只返回要附加的所有实体的集合就足够了
    • @CervEd 该示例返回集合的集合(即列表列表) - 例如,一个人可能有一个孩子列表和一个朋友列表,此方法将有效地返回一个由以下组成的集合这两个系列
    • @qujck 确实如此,尽管在这个例子中我想知道是否有理由这样做。我想知道它是否不仅会导致不必要的迭代
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多