使用MVC上下文菜单和EF

时间:2018-08-13 17:08:46

标签: 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(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菜单创建一个list类型的视图,并且将ExtractionPourFicheSante_Result作为视图模型实际上返回错误:

  

'ExtractionPourFicheSante_Result'没有定义主键。定义此实体类型的键。

好的,最适合用作主键的是TheKey,我肯定知道它是唯一的。用google搜索并在SO上搜索...尚未发现有关在存储过程中定义主键的任何信息。都没有发现任何让EF假装的东西。我可以像往常一样解决此问题。但是我受够了...

使用当前版本的EF可能无法实现。奇怪的是,他们允许导入这样的存储过程,然后又不能使用它,因为选择部分没有主键。

任何干净的解决方案?有人经历过这个吗?非常感谢您阅读。

2 个答案:

答案 0 :(得分:0)

不确定,但尝试在select语句中使用row_number

                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

确保为proc生成了ComplexType和FunctionImport。 另外,请确保定期保存edmx文件。

答案 1 :(得分:0)

在生成的模型类(MVC,C#,由实体生成)中,添加了两行 TEMPORARILY

//------------------------------------------------------------------------------
// <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 */
    }
}

通过添加[Key]关键字,它模拟了一个主键,但是您将需要复制粘贴上面的using。

正确设置这些设置将允许您使用MVC上下文菜单使用View创建者,就像处理普通表一样(它适用于list,不确定edit等)。

自动创建视图后,知道重新生成模型将擦除上面的这两行,但是无论是否设置了Key,创建的视图都会保留并且将完全起作用(适用于list类型)。