2

最近几天我一直在玩EF。我们的应用程序基于 SQL Anywhere 10 数据库,我们所有的数据访问都是通过存储过程完成的。由于 SA 10 不支持 EF,我正在使用 SA 11 测试 EF。为此,我创建了一个包含 2 个表和几个存储过程的小型数据库(基于 asp.net mvc 示例中的 nerddinner 数据库,请参阅这里)我已经从数据库、表和存储过程创建了一个模型,并进行了必要的函数导入。我有一个具有以下签名的存储过程:

ALTER PROCEDURE "DBA"."get_dinner"( @dinner_id integer)
BEGIN
select dinner_id, title, event_date, description, hosted_by , contact_phone, address, country, latitude, longitude
from dba.dinners d
where d.dinner_id = @dinner_id
END

生成的函数导入代码如下所示:

public global::System.Data.Objects.ObjectResult<dinner> get_dinner(global::System.Data.Objects.ObjectParameter dinner_id)
{
    return base.ExecuteFunction<dinner>("get_dinner", dinner_id);
}

这就是问题所在。理想情况下,生成的代码应该接受一个 int 参数,而不是 global::System.Data.Objects.ObjectParameter dinner_id 据我所见,edmx 文件包含正确解释参数类型所需的所有数据:

<Function Name="get_dinner" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="DBA">
  <Parameter Name="dinner_id" Type="int" Mode="InOut" />
</Function>

我在这里错过了什么吗?为了使用正确的参数类型导入函数,还需要什么?这是您可以通过调整 edmx 文件来纠正的问题,还是 SA11 EF 支持实现的问题。

希望有人能给我一些进一步的线索。

4

1 回答 1

1

这是函数导入的 InOut 参数和代码生成的已知问题。

我们一直在讨论让 InOut 参数生成如下代码:

public ObjectResults<dinner> get_dinner(ref int dinner_id);

而不是你所拥有的。

要尝试的一件事是将“InOut”转换为“In”参数。然后代码生成应该产生如下内容:

public ObjectResults<dinner> get_dinner(int dinner_id);

真正的问题是,如果你调用它,它会起作用吗?

希望这个背景有帮助

干杯

亚历克斯

于 2009-06-13T05:45:30.880 回答