C# 实体框架不生成结果类

C# 实体框架不生成结果类,c#,sql-server,entity-framework,stored-procedures,C#,Sql Server,Entity Framework,Stored Procedures,首先,我一直在寻找解决方案,但也许我做得不好,因为我可能遗漏了一些概念 所以我的问题是:我正在开发一个应用程序来处理数据库,使用实体框架。我使用EF Designer从数据库创建模型,导入所有表、函数和存储过程。接下来是问题。当C生成代码时,它还会生成类似storedProcedureName_Result的类,正如其名称所示,它是存储过程的结果。C生成如下代码: public virtual ObjectResult<uSP_ListSpecialities_Result> uS

首先,我一直在寻找解决方案,但也许我做得不好,因为我可能遗漏了一些概念

所以我的问题是:我正在开发一个应用程序来处理数据库,使用实体框架。我使用EF Designer从数据库创建模型,导入所有表、函数和存储过程。接下来是问题。当C生成代码时,它还会生成类似storedProcedureName_Result的类,正如其名称所示,它是存储过程的结果。C生成如下代码:

 public virtual ObjectResult<uSP_ListSpecialities_Result> uSP_ListSpecialities()
    {
        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<uSP_ListSpecialities_Result>("uSP_ListSpecialities");
    }
它生成一个uSP_ListSpecialities_结果类

但这一条没有:

CREATE PROCEDURE uSP_ListAvailableMedicBi
AS
BEGIN
    SELECT P.biPessoa
    FROM Pessoa P
        LEFT JOIN Medico M
            ON( M.biPessoa = P.biPessoa)
    WHERE M.biPessoa IS NULL
END
我在SQLSMS上运行了这两个程序,都返回了应该返回的内容


提前感谢您

uSP\U ListAvailableMedicBi过程返回可为空的整数,那么如果它只是一个标准的.NET类型,那么生成结果类有什么意义呢

编辑

根据你的评论。它确实为您返回了一张桌子。它只是没有创建复杂类型,因为它不需要。下面的代码片段将帮助您:

public List<int> GetAvailableMedicBiList()
{
    using(var ctx = YourEntities())
    {
        return (List<int>)ctx.uSP_ListAvailableMedicBi().ToList();
    }
}

我创建了一个返回int的虚拟sp,并得到以下结果:


您可以在这里看到,我已选择Complex作为的returns集合,并在底部单击了Create New Complex Type(创建新的复杂类型),该类型为我创建了对象,这是我假定您想要的。

根据我的记忆,当通过设计器导入sp时,您可以选择“创建新的复杂类型”。@Ric您是对的,但为什么有人要为一个只返回可为null的过程生成复杂结果?不知道,没有太多意义,可能有原因吗?@Ric我还发现,复杂类型在组合框上没有结果我不想要可为null的,这就是重点,我想要一个结果类,它的属性是biPessoa,我的重点是,uSP_ListAvailableMedicBi应该返回一个带有P.biPessoa属性的表。uSP_ListSpecialities生成一个结果。好的,我没有指定返回参数,但是为什么一个生成一个结果,另一个生成一个可为null的?然后按照建议执行,在模型浏览器中选择SP并创建新的复杂类型。@DanielS。因为第一个过程返回包含多个字段的表,所以它必须创建一个包含这些字段的类型。第二个过程只返回一个简单的int,那么为什么它要为它创建一个类呢sense@MajkeloDev是的,这是有道理的。正如我所说,我遗漏了一些概念:只是另一件事。它返回一个可为null的值,但biPessoa是表Pessoa中的主键。我应该在哪里指定不需要可为null的值?因为,如果我不指定它,我将有一个列表,而且没有必要,因为我知道它将有一个值。如果它是PK,它不应该创建可为null的类型-这很奇怪。转到您正在使用的sql客户端,确保Pessoa.biPessoa是int not null类型。OP得到了他想要的,但我找不到原因。在您的SP上,您将值定义为输出?SP比您的SP更简单,只是选择1-仅此而已。哦,好的。但是@MajkeloDev说过,没有必要生成类。但是谢谢你的解释!从技术上讲,您可以创建一个具有列属性的类,但是仅返回一个列可能无法保证这样的复杂性,内置类型应该足够了-调用由您来完成。
CREATE PROCEDURE uSP_ListAvailableMedicBi
AS
BEGIN
    SELECT P.biPessoa
    FROM Pessoa P
        LEFT JOIN Medico M
            ON( M.biPessoa = P.biPessoa)
    WHERE M.biPessoa IS NULL
END
public List<int> GetAvailableMedicBiList()
{
    using(var ctx = YourEntities())
    {
        return (List<int>)ctx.uSP_ListAvailableMedicBi().ToList();
    }
}