C# 如何将实体框架与存储过程和POCO一起使用

C# 如何将实体框架与存储过程和POCO一起使用,c#,entity-framework,stored-procedures,poco,C#,Entity Framework,Stored Procedures,Poco,我在这里尝试将实体框架与存储过程、POCO和两个不同的项目一起使用 我有一个项目DataAccess(用于我的edmx和DataContext)和一个项目BusinessEntities(用于我的POCO)。 DataAccess具有业务实体的引用 在我的数据库中,我有一个非常标准的SP: CREATE STORED PROCEDURE GetHeader @id CHAR(35) AS BEGIN SELECT ID, Name FROM mytable WHERE ID =

我在这里尝试将实体框架与存储过程、POCO和两个不同的项目一起使用

我有一个项目DataAccess(用于我的edmx和DataContext)和一个项目BusinessEntities(用于我的POCO)。
DataAccess具有业务实体的引用

在我的数据库中,我有一个非常标准的SP:

CREATE STORED PROCEDURE GetHeader
    @id CHAR(35)
AS
BEGIN
    SELECT ID, Name FROM mytable WHERE ID = @id
END
数据上下文是:

public class DbContext : ObjectContext
{
public ObjectResult<BusinessEntities.GetHeaderResult> GetHeader(string id)
{
return base.ExecuteFunction<BusinessEntities.GetHeaderResult>("GetHeader", new ObjectParameter("id", id));
}
}
如果正确导入函数,则会出现以下错误:

System.InvalidOperationException: The FunctionImport &#39;GetHeader&#39; could not be found in the container &#39;DbEntities&#39;.
System.InvalidOperationException:ExecuteFunction中的类型参数“BusinessEntites.GetHeaderResult”与该函数返回的类型“DbModel.GetHeaderResult”不兼容

我想这只是一个简单的设置,但我似乎无法抓住它


请注意EDMX文件的设置是否正确(CodeGenerationsStrategy设置为none,CustomTool为空)

在第一种情况下,您在上下文中调用了错误的方法<代码>执行函数仅用于函数导入。改用
ExecuteStoreQuery
SqlParameter
。在第二种情况下,函数导入还会在EDMX中创建一个复杂类型,EF希望您将使用该复杂类型作为函数导入调用的结果。

在第一种情况下,您在上下文中调用了错误的方法<代码>执行函数仅用于函数导入。改用
ExecuteStoreQuery
SqlParameter
。在第二种情况下,函数导入也会在EDMX中创建一个复杂类型,EF希望您在函数导入调用后使用该复杂类型。

因此,基本上,如果我的BE在另一个项目中,我需要使用ExecuteStoreQuery,并且没有其他选择?我在这里发布了一个关于此主题的示例()。“在第二种情况下,函数导入还会在EDMX中创建复杂类型“如果我导入两个存储过程,每个存储过程具有不同的结果集,它会为每个存储过程创建复杂类型吗?我查看了从ObjectContext继承的分部类,但在其中找不到任何其他类型,并且在实体数据模型向导中最初选择表时选择了所需的存储过程。有什么想法吗?Thanks@Hans:在EDM向导期间选择存储过程只是第一步。然后需要在创建复杂类型的位置声明函数导入。完成后,新的复杂类型现在显示:)。有没有可能在聊天室和你交谈,因为我仍然有一些关于如何执行/存储结果的问题?谢谢你的时间。所以基本上如果我的BE在另一个项目中,我需要使用ExecuteStoreQuery,没有其他选择?我在这里发布了一个关于这个主题的示例()。“在第二种情况下,函数导入也会在EDMX中创建一个复杂类型”如果我导入两个存储过程,每个存储过程都有不同的结果集,它会为每种类型创建一个复杂类型吗?我查看了从ObjectContext继承的分部类,但在其中找不到任何其他类型,并且在实体数据模型向导中最初选择表时选择了所需的存储过程。有什么想法吗?Thanks@Hans:在EDM向导期间选择存储过程只是第一步。然后需要在创建复杂类型的位置声明函数导入。完成后,新的复杂类型现在显示:)。有没有可能在聊天室和你交谈,因为我仍然有一些关于如何执行/存储结果的问题?谢谢你抽出时间。