【发布时间】: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 视图时(我经常使用它,它为我节省了很多时间)一个窗口弹出窗口并告诉您在您的类中没有定义主键...如果它是
edit或create视图...它需要一个主键是的。但这只是list视图,所以我真的不需要它。
标签: c# sql-server asp.net-mvc entity-framework