![](/img/trans.png)
[英]How can I use a stored procedure that uses tables with Entity Framework
[英]How can I use Entity Framework to load the results of a stored procedure?
我有一个挑战。 我们有一个最初设计用于VB6的数据库,大多数功能都存储在存储过程中。 我无法对存储过程进行更改,因为旧的应用程序仍然需要工作一段时间,而且我没有自己的数据库副本,我甚至可以简单地修改它。
那么是否可以从EF执行存储过程并让它最好将结果写入POCO的数组/集合中?
我已经尝试了数据库第一种方法和导入,但EF说存储过程不返回任何列,因此无法创建复杂类型。 我发现有一些方法可以改变存储过程以使其工作,但我无法改变我正在使用的数据库。
另一个挑战是结果中列的名称是“日期最后更改”,换句话说是空格。 EF将如何映射这些? 它会变成DataLastChanged还是Data_last_changed? 有没有办法用我的POCO标记属性来说明它们是如何映射的?
我希望的是类似的东西
var resuls = efContext.ExecuteStoredProcedure<MyPOCOType>("spName",param1, param2, ...);
并且让EF最好将结果与类型相匹配。 这样的事情存在吗? 顺便提一下,我们使用的是EF4,但我相信我们可以使用EF4。
我想我已经为自己解决了部分问题。 以下代码片段可以满足我的需求。
using (DbContext context = new DbContext("DBConnectionStringNameFromAppConfig"))
{
SqlParameter[] parameters =
{
new SqlParameter("@OwnerID", DBNull.Value),
new SqlParameter("@ExternalColorID", colorOwner.ExternalColorID),
new SqlParameter("@ProductionSiteID", DBNull.Value),
new SqlParameter("@PanelstatusNr", DBNull.Value),
new SqlParameter("@DateLastChecked", DBNull.Value),
new SqlParameter("@rowcount", DBNull.Value),
};
var colors = context.Database.SqlQuery<Models.ColorSelectEvaluation>("[dbo].[sp_Color_Select_Evaluation] @OwnerID, @ExternalColorID, @ProductionSiteID, @PanelstatusNr, @DateLastChecked, @rowcount", parameters).ToList();
}
令人困惑的仍然是列的命名。 它们似乎主要起作用,但EF并未将结果列“需要评估”映射到我的对象上的属性NeedsEvaluation。
关于列名不匹配。 stackoverflow上的另一个问答很好地解决了这个问题。 为什么在从DbSet <T> .SqlQuery映射实体时忽略了我的DbModelBuilder配置?
总而言之,MS认为它会很棒,但它们不支持以这种方式映射名称。 唯一的解决方案是更改存储过程,这对我来说是没有选择的,因为它会破坏仍在使用它的遗留应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.