c# - Entity Framework 存储过程结果映射

标签 c# .net entity-framework

过去几天,我一直在互联网上寻找与我的问题类似的主题。我终于求助于自己问这个问题。

使用代码优先方法和 EF 4.3.1,我创建了上下文类、实体类和用于存储存储过程输出的类。上下文类具有使用 SqlQuery<T> 执行某些存储过程的方法。 .

例子:

public IEnumerable<Results> GetData(int id)
{
   var parameters = new SqlParameter[] { new SqlParameter("@id", id) };
   var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id",    parameters);
   var data= result.ToList<Result>();

   return data;
}

当我跟踪我的调试时,我的数据返回,并且数据被映射到具有匹配名称的属性。但是,在输出中有一列带有 "/"在名称中(例如:Info/Data)。显然我不能这样命名属性,所以我想我可以使用列属性 ([Column("Info/Data")]) 映射输出:

[Column("Info/Data")]
public string InfoData
{
   get { return infoData; }
   set { infoData= value; }
}

我什至尝试使用逐字运算符 ( [Column(@"Info/Data")] ),用 [] 包裹文本([Column("[Info/Data]")]),我都试过了([Column(@"[Info/Data]")])。在单步执行代码时,我看到分配了具有匹配列名的属性,但在分配期间忽略并跳过了具有列属性的属性。

我还为实体的每一列尝试了 fluent-api。

    modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data");

但这会引发以下异常:

The data reader is incompatible with the specified 'NameSpace.Result'. A member of the type, 'InfoData', does not have a corresponding column in the data reader with the same name.

在我的项目中 NameSpace.Result是一个类(为了安全起见更改了名称)并且 InfoDatais是我尝试使用 fluent-api 映射的属性(相应的 sql 列中有一个/;例如:Info/Data)。

有人遇到过这个问题吗?

如果我的问题不清楚或者之前有人问过,请告诉我。

最佳答案

我现在意识到这是一个老问题了,但由于 OP 最近的回答已经提出了这个问题,也许人们仍然对它感兴趣。

如果您按原样使用存储过程并且它返回与 EF 不兼容的列名称,看到您正在传递 SQL 以使用 SqlQuery 直接调用过程,您可以使用INSERT-EXEC 方法来做一些事情,比如声明一个表变量(具有更兼容的列名),将存储的过程 INSERT-EXEC 到表变量中,然后从表变量中选择作为结果集?

传入的 SQL 将是冗长的 SQL,因此我的解决方案不是一个令人满意的解决方案,但作为一种思考练习,看看这是否是解决问题的方法,我认为我会提供它。

关于此类问题的好文章:http://www.sommarskog.se/share_data.html - 大多数方法都没有帮助,因为您无法更改存储过程(因此可能几乎无法访问数据库结构或根本无法对其进行更改?),但 INSERT-EXEC 方法弹出为一种可能的解决方法,无需更改数据库级别的任何内容...

关于c# - Entity Framework 存储过程结果映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10148103/

相关文章:

c# - 它不会返回类中的值

c# - 第一次显示控件后会立即发生什么事件?

.net - 嵌套/子事务范围回滚

c# - 当前上下文中不存在名称 'InitializeComponent'。无法获得任何网络搜索帮助

c# - ASP.NET MVC4 一 View 多模型

c# - 如何从客户端获取原始数据包?

c# - Reflection.Emit 中的短格式操作码错误

c# - 访问被拒绝冒充当前用户访问网络文件夹

c# - 那里有好的第三方 EDMX 生成器/更新器工具吗?

entity-framework - 在同一个查询中使用 .Find() 和 .Include()