它从一个看起来像这样的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 文件。