实体框架 - 附加实体 - 附加导航属性?

时间:2013-05-07 13:02:44

标签: entity-framework entity-framework-5

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

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

    this._dbContext.SaveChanges();

    return entity;
}

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

1 个答案:

答案 0 :(得分:5)

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

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;
        }
    }
}