C# 使用MVC上下文菜单和EF从存储过程生成列表视图

C# 使用MVC上下文菜单和EF从存储过程生成列表视图,c#,sql-server,asp.net-mvc,entity-framework,C#,Sql Server,Asp.net Mvc,Entity Framework,它从一个SQL Server存储过程开始,如下所示: CREATE PROCEDURE [dbo].[ExtractionPourFicheSante] @AnBudg NVARCHAR(4), @Ecole NVARCHAR(3), @Fiche NVARCHAR(10), @grprep NVARCHAR(20), @classi NVARCHAR(20) AS BEGIN SET NOCOUNT ON; IF (ISNULL(NUL

它从一个SQL Server存储过程开始,如下所示:

CREATE PROCEDURE [dbo].[ExtractionPourFicheSante]
    @AnBudg NVARCHAR(4),
    @Ecole NVARCHAR(3),
    @Fiche NVARCHAR(10),
    @grprep NVARCHAR(20),
    @classi NVARCHAR(20)
AS
BEGIN
    SET NOCOUNT ON;

    IF (ISNULL(NULLIF(LTRIM(RTRIM(@Fiche)), ''), 'NA') = 'NA')
        IF (ISNULL(NULLIF(LTRIM(RTRIM(@grprep)), ''), 'NA') = 'NA')
            IF (ISNULL(NULLIF(LTRIM(RTRIM(@classi)), ''), 'NA') = 'NA')
                SELECT
                    ISNULL(z.FICHE, '123456789') AS TheKey,
                    z.*
                FROM  
                    [gpi].dbo.GPM_E_ELE_Z_DOSSIER Z
            ELSE
                /* similar query */
        ELSE
            /* similar query */
     ELSE
         /* similar query */
END
然后使用EF 6.0数据库优先方法将其引入ASP.NET MVC项目

通过在EDMX文件中单击鼠标右键,使用自动映射器将存储过程引入

现在,尝试使用上下文MVC菜单创建一个列表类型视图,视图模型实际返回一个错误,ExtractionPourFicheSante_结果为:

“ExtractionPourFicheSante_结果”未定义主键。定义此实体类型的键

好吧,作为主键的最佳候选者是我确信是唯一的键。通过谷歌搜索等等。。。尚未找到有关在存储过程中定义主键的任何信息。两人都没有发现任何让EF假装存在的东西。我可以像往常一样解决这个问题。但我已经受够了

对于当前版本的EF,这可能是不可能的。奇怪的是,他们允许导入这样一个存储过程,但却无法使用它,因为select部件中没有主键


有清洁的解决方案吗?有人经历过这件事吗?非常感谢阅读。

不确定,但请尝试在select语句中使用行号

                SELECT
                    ISNULL(z.FICHE, '123456789') AS TheKey,
                    z.*,
                    row_number() over (order by z.createddate desc) rowID 
                FROM  
                    [gpi].dbo.GPM_E_ELE_Z_DOSSIER Z
确保已为进程生成ComplexType和FunctionImport。
还要确保定期保存edmx文件。

在生成的模型类MVC、C、由实体生成中,临时添加了两行:

通过添加[Key]关键字,它模拟主键,您需要使用上面的方法复制粘贴

正确设置这些选项将允许您使用MVC上下文菜单来使用视图创建者,就像您在列表中使用的普通表一样,不确定编辑和其他


一旦视图被自动创建,要知道重新生成模型将删除上面的两行,但创建的视图将保持完整功能,无论键是否设置为列表类型。

尝试将[Key]属性添加到模型类中的该字段。不考虑EF本身的问题,这个SP主体看起来一点也不好。您可以使用fluent API而不是注释来添加它-不确定。也不要考虑使用EF来调用存储过程。如果您想使用ADO.Net之上的抽象,Dapper是简单而轻量级的。您是否在模型浏览器的复杂类型下看到ExtractionPourFicheSante_结果?复杂类型不需要主键。@GertArnold是的,这是正确的,但是当您想从上下文菜单中自动创建MVC视图时,我经常使用它,这样可以在弹出窗口中告诉您类中没有定义主键,从而节省我很多时间。。。如果是编辑或创建视图。。。它需要主键yes。但是它只是一个列表视图,所以我并不真正需要它。拥有唯一的行号是一个好方法,但是当涉及到使用visual studio上下文菜单自动生成列表视图时,MVC仍然不喜欢它
//------------------------------------------------------------------------------
// <auto-generated>
//------------------------------------------------------------------------------

using System.ComponentModel.DataAnnotations;               // THIS ONE

namespace Rapport_CE_MVC.Models
{
    using System;

    public partial class ExtractionPourFicheSante_Result
    {
        [Key]                                              // AND THIS ONE
        public string fonds { get; set; }

        /* all the rest of the properties */
    }
}