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



它从一个看起来像这样的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我肯定知道它是唯一的。用谷歌搜索,并在SO...未找到有关在存储过程中定义主键的任何内容。两人都没有找到任何关于让 EF 假装有一个的东西。我可以像往常一样解决这个问题。但是我已经受够了...

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

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

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

//------------------------------------------------------------------------------
// <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 上下文菜单使用 View 创建者,就像处理普通表一样(它适用于list,不确定edit和其他

(。自动创建视图后,请注意重新生成模型将擦除上面的 2 行,但创建的视图将保留,并且无论是否设置 Key 都将完全正常运行(适用于list类型(。

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

确保已为过程生成 ComplexType 和 FunctionImport。 还要确保定期保存 edmx 文件。

最新更新