【问题标题】:Generate list view from stored procedure using MVC contextual menus and EF使用 MVC 上下文菜单和 EF 从存储过程生成列表视图
【发布时间】:2018-08-13 17:08:45
【问题描述】:

它从一个如下所示的 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 文件,使用自动映射器引入存储过程。

现在尝试创建list 类型视图使用上下文MVC 菜单ExtractionPourFicheSante_Result 作为视图模型实际上返回错误:

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

好吧,作为主键的最佳候选者是TheKey,我知道它肯定是唯一的。用谷歌搜索并在 SO... 没有找到任何关于在存储过程中定义主键的信息。两者都没有发现任何关于让 EF 假装存在的东西。我可以像往常一样解决这个问题。但是我已经受够了……

对于当前版本的 EF,这可能是不可能的。奇怪的是,他们允许导入这样一个存储过程,然后由于选择部分没有涉及主键,所以无法使用它。

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

【问题讨论】:

  • 尝试将[key] 属性添加到模型类中的该字段。
  • 不考虑EF本身的问题,这个SP体看起来一点都不好。
  • 您也许可以使用 fluent API 而不是注释来添加它 - 不确定。还要考虑不使用 EF 调用存储过程。如果您想在 ADO.Net 之上使用抽象,Dapper 既简单又轻量。
  • 在模型浏览器的复杂类型下看到ExtractionPourFicheSante_Result了吗?复杂类型不需要有主键。
  • @GertArnold 是的,这都是真的,但是当你想从上下文菜单“自动创建”MVC 视图时(我经常使用它,它为我节省了很多时间)一个窗口弹出窗口并告诉您在您的类中没有定义主键...如果它是editcreate 视图...它需要一个主键是的。但这只是 list 视图,所以我真的不需要它。

标签: c# sql-server asp.net-mvc entity-framework


【解决方案1】:

在生成的模型类(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]关键字,它模拟一个主键,你需要复制粘贴上面的使用。

正确设置这些将允许您使用 MVC 上下文菜单来使用视图创建者,就像您对普通表格一样(它适用于 list,不确定 edit 和其他人)。

一旦视图被自动创建,请知道重新生成模型将删除上面的那 2 行,但创建的视图仍然存在,并且无论是否设置了 Key(适用于 list 类型)都将保持完整功能。

【讨论】:

    【解决方案2】:

    不确定,但请尝试在 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 文件。

    【讨论】:

    • 拥有唯一行号是一种好方法,但在使用 Visual Studio 上下文菜单自动生成 list view 时,MVC 仍然不喜欢它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2018-06-15
    相关资源
    最近更新 更多