过去几天,我一直在互联网上寻找与我的问题类似的主题。我终于求助于自己问这个问题。
使用代码优先方法和 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/