在EF 5或EF 6 CodeFirst中映射多个结果集存储过程

本文关键字:EF 结果 存储过程 映射 CodeFirst | 更新日期: 2024-09-21 23:07:12

我有一个如下的实体模型:

public Entity
{
    //Properties
}
public Activity : Entity
{
    //Properties
    public Action Action { get; set; }
    public ICollection<Command> Commands { get; set; }
}
public Action : Entity
{
    //Properties
}
public Command : Entity
{
    //Properties
}

我有一个存储过程,它返回活动列表以及每个活动的相关操作和命令。如何在EF5或EF6 Codefirst中映射前面提到的存储过程的结果集?我已经使用了ObjectContext.Translate方法,MSDN的文章《具有多个结果集的存储过程》中对此进行了解释。

但问题是,我所有的实体都是从Entity类派生的,这就是为什么当我使用ObjectContext.Translate代替Activity。。我不能将它用于ActionCommand,因为它将Entity类的EntitySetName映射到Activity,所以如果我将其用于ActionCommand,它将引发错误。我该怎么办?

在EF 5或EF 6 CodeFirst中映射多个结果集存储过程

在EF5或更高版本中,具有多个结果集的存储过程是非常可能的。这是详细答案的链接

具有多个结果集的存储过程

这是IDataReader 的扩展

    public static List<T> MapTo<T>(this IDataReader dr)
    {
        var list = new List<T>();
        while (dr.Read())
        {
            var obj = Activator.CreateInstance<T>();
            foreach (var prop in obj.GetType().GetProperties())
            {
                if (!Equals(dr[prop.Name], DBNull.Value))
                {
                    prop.SetValue(obj, dr[prop.Name], null);
                }
            }
            list.Add(obj);
        }
        return list;
    }