它始于一个看起来像这样的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可能无法实现。奇怪的是,他们允许导入这样的存储过程,然后又不能使用它,因为选择部分没有主键。
任何干净的解决方案?有人经历过这个吗?非常感谢您阅读。
答案 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
类型)。