4

尝试将存储过程作为 Entity Framework 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)创建的。

功能映射:

在此处输入图像描述

更多功能映射详细信息:

在此处输入图像描述

testy_Result 类:

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

2 回答 2

2

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

于 2014-10-10T21:27:14.920 回答
0

我不知道这是否有帮助,但这是我通常做的:

假设您有来自实体框架的以下 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);
        }

让我知道它是否对您有用。

干杯。

于 2013-06-21T00:31:25.790 回答