Sql server 向实体框架模型添加SQL Server存储过程的推荐方法是什么
总结 在我们的应用程序中,我们使用实体框架6和SQL Server 2016。在将具有复杂逻辑的存储过程导入EF模型时,特别是在使用临时表时,我们将:Sql server 向实体框架模型添加SQL Server存储过程的推荐方法是什么,sql-server,entity-framework,stored-procedures,fmtonly,Sql Server,Entity Framework,Stored Procedures,Fmtonly,总结 在我们的应用程序中,我们使用实体框架6和SQL Server 2016。在将具有复杂逻辑的存储过程导入EF模型时,特别是在使用临时表时,我们将: SET FMTONLY OFF 这将导致存储过程运行完整的逻辑,从而返回正确的输出格式,从而允许EF模型正确生成复杂类型 一般来说,它工作正常。但是,Microsoft文档声明:不要使用此功能。所以我想知道推荐的导入存储过程并正确生成复杂类型的方法是什么 更多细节 首先,我被这条短信弄糊涂了,不要在微软网站上使用关于FMTONLY的这个功能。这
SET FMTONLY OFF
这将导致存储过程运行完整的逻辑,从而返回正确的输出格式,从而允许EF模型正确生成复杂类型
一般来说,它工作正常。但是,Microsoft文档声明:不要使用此功能。所以我想知道推荐的导入存储过程并正确生成复杂类型的方法是什么
更多细节
首先,我被这条短信弄糊涂了,不要在微软网站上使用关于FMTONLY的这个功能。这不是EF模型更新程序调用的带选项ON的同一个命令吗?这意味着EF模型更新程序使用了一个不应该使用的特性
其次,我假设EF模型更新程序的行为旨在防止在所有输入参数均为NULL的情况下执行存储过程时发生不必要的DB数据操纵。但实际行为似乎与这一假设不符
考虑下面的一个简单存储过程,我试图避免使用SET FMTONLY OFF。在更新Visual Studio 2013 CU 5 Pro中的EF模型时,我使用SQL profiler分析了确切的行为
SET NOCOUNT ON;
IF (1=0) --FOR EF edmx update this will actually execute
BEGIN
DECLARE @tempTable TABLE
(
[id] [int],
[date_local] [datetime2](7),
[value] [float] NULL
)
SELECT * FROM @tempTable
RETURN 0
END
CREATE TABLE #TempValue
(
[id] [int] NOT NULL,
[date_local] [datetime2](7) NOT NULL,
[value] [float] NULL
CONSTRAINT [PK_TempValue]
PRIMARY KEY CLUSTERED ([id] ASC, [date_local] ASC)
WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO #TempValue (id, date_local, value)
SELECT @id, *
FROM OPENJSON(@valueJson)
WITH (
date_local datetime2(7) '$.dateTime',
value float '$.value'
);
SELECT * FROM #TempValue
要点:
EF模型更新程序调用它,在SET FMTONLY打开的情况下,如果1=0(如预期)进入,并正确运行SELECT*from@TESTERABLE
它忽略返回0并继续运行存储过程主体的其余部分
它跳过了CREATE TABLE TempValue,但随后尝试将INSERT运行到TempValue中,而TempValue当然不存在,因此它停止在这里,不执行SELECT*FROM TempValue,这也会失败
在本例中,复杂类型生成正确,因为最后一次成功的选择是select*from@TENTRABLE。但我觉得这只是运气,因为没有后续的实际运行的选择。对我来说,整个行为都是有缺陷的,特别是跳过返回0和创建表TempValue,然后允许插入到;如果您允许INSERT INTO,您肯定没有保留DB数据吗
因此,我们尝试的两种实际可行的变通方法如下:
把布景放在最上面。它可以工作,但我对此有点担心。请不要在Microsoft网站上使用此功能
注释掉整个SP主体并添加DECLARE@tentable。。。如上例所示,从@tentable中选择*。更新EF模型后,删除添加的块并取消对原始代码的注释。每次更新EF模型时都要这样做,所以效率不是很高
什么是正确且推荐的方法?您没有发布任何与EF相关的内容,没有从EF调用存储过程,也没有将存储过程映射到EFentities@PanagiotisKanavos这是关于创建正确的EF模型,而不是调用SP,因此我没有发布任何关于调用它的内容。我们使用数据库优先的方法,因此到实体的映射是由EF模型更新程序根据数据库中的实际SP完成的,而这与存储过程的内容无关。仅显示结果列和实体属性。真正的问题是如何对存储过程结果中的类进行反向工程吗?@PanagiotisKanavos我认为这与存储过程的内容有很大关系,因为根据您在SP中使用的命令和流,EF模型更新程序会得到不同的结果。我并没有试图对这些类进行反向工程;我正试图了解EF模型更新程序的行为,以及在EF模型中构建SP输出的复杂类型的推荐方法,然后将其转换为类。所有ORM都做一件事——将对象实体映射到关系结构。对象端是实体,而不是表。因为代码处理的是实体,而不是表。不要介意eg VIEWMODEL与用来填充它们的表格没有什么关系。现在可用的是将数据库反向工程到类中。你必须加上Erik Jenssen或Michael Sawczyn的才能得到视觉设计师