2013-05-08 11 views
3

当试图导入存储过程作为实体框架5中的函数时,出现以下错误。我最近更新了数据项目以引用新版EF。执行函数中的类型参数与函数返回的类型不兼容

在ExecuteFunction来的类型参数“SSDS.Data.testy_Result”是 与类型不兼容“SSDS.Data.testy_Result”由 函数返回。

我无法得到它的任何存储过程的工作......这是我简单的测试之一:

CREATE PROCEDURE testy 

AS 
BEGIN 
    select 'hello' as hello 
END 
GO 

它打破上面这里的例外:

public virtual ObjectResult<testy_Result> testy() 
    { 
     return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<testy_Result>("testy"); 
    } 

并且在模型设计器的“编辑功能导入”窗口中将结果设置为字符串标量时没有错误。

我打电话这样的功能:

private Entities db = new Entities(); 
var x = db.testy(); 

有没有办法,我在这里失踪了一些东西明显?在我的项目中有几个edmx文件,其他文件是使用较旧版本的EF创建的(并使用ObjectContext)。

函数映射:

enter image description here

更多函数映射详细信息:

enter image description here

testy_Result类:

public partial class testy_Result 
    { 
     public string hello { get; set; } 
    } 
+0

尝试将过程中的值转换为varchar或nvarchar – 2013-05-08 14:58:48

+0

检查导入函数的映射是否与选定的返回类型匹配。在模型资源管理器中,右键单击导入的函数并选择“函数导入映射”。确保左边的属性与右边的字段匹配 – James 2013-05-08 17:47:25

+0

@RuiJarimba在proc中强制转换does not帮助 – woggles 2013-05-09 14:25:46

回答

0

我不知道这是否会有所帮助,但在这里是我创造的erally做:

假设你从实体框架有以下POCO类:

using System; 

public partial class testy_Result 
{ 
    public string hello { get; set; } 
} 

以下调用通常的伎俩对我来说:

public partial class Entities: DbContext 
{ 

    public virtual ObjectResult<testy_Result> testy() 
    { 
     ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(testy_Result).Assembly); 

     return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<testy_Result> 
      ("testy", MergeOption.OverwriteChanges); 
    } 
} 

此外,为了以防万一,我把我的电话打包在using子句中:

 try 
     { 
      using (Models.Data.Entities Entities = new Models.Data.Entities()) 
      { 
       var x = Entities.testy().FirstOrDefault().hello; 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine("Error: " + ex.Message); 
     } 

让我知道它是否适用于您。

干杯。

2

过去几天我一直在努力解决这个问题。我的项目也从以前版本的实体框架升级到5.0。我终于明白这是由于新旧edmxs的混合。删除旧的edmx允许新的工作,但当然这不是一个可行的解决方案。我还能够通过将新(EF 5)edmx的代码生成策略更改为“Legacy ObjectContext”来实现它。如果您不熟悉,可以通过打开edmx图,右键单击并转至“属性”来找到。我怀疑项目中的所有edmxs只需要使用相同的代码生成策略,所以您可能也可以将旧的改为T4,尽管这可能会涉及更多工作。