0

我已经将我的项目从Linq到SQL迁移到实体框架6.解决了很多问题后,我终于找到了一个我不确定如何处理它。转换后大约三分之一的单元测试失败,因为存储过程返回标量值just work different way将存储过程从LINQ迁移到SQL到实体框架6

在Linq-to-SQL中,存储过程返回返回的值。在EF中,他们返回受影响的行数。有解决方法需要更改存储过程(通常从RETURN @retvalueSELECT @retvalue)。但是这需要T-SQL的改变。该项目仍包含一些旧版ASP.NET的遗留代码,如aspnet_Membership_CreateUser等。这意味着我无法更改这些存储过程,因为ASP.NET ADO.NET成员资格提供程序部分使用了这些过程,部分由Linq-to-SQL代码使用。我考虑的解决方案是使这些部分遗留代码的T-SQL包装。

我想保持存储过程不变的另一个原因是,如果升级到EF不成功,可能会恢复到以前的提交。 A不希望再次更改数据库。但是这个原因不是很强,只是关于我的懒惰。

我知道成员资格提供者是老式的,但我不能在一次提交中重写整个应用程序,我需要保持它的稳定。

完成迁移的最好方法是从EF调用存储过程,如Linq-to-SQL,但我没有找到办法。 EF在这方面让我失望。经过几年的发展,EF不支持从存储过程返回标量值的可能性如何?

你会如何解决这个问题?

回答

0

Finnaly我结束了包装,其中保存数据库(ASP.NET的MembershipProvider)的原始功能,并创建存储过程版本的EntityFramework:

CREATE PROCEDURE [dbo].[aspnet_UsersInRoles_AddUsersToRolesEF] 
    @ApplicationName nvarchar(256), 
    @UserNames  nvarchar(4000), 
    @RoleNames  nvarchar(4000), 
    @CurrentTimeUtc datetime 
AS 
BEGIN 
    DECLARE @return_value int 

EXEC @return_value = [dbo].[aspnet_UsersInRoles_AddUsersToRoles] 
     @ApplicationName, 
     @UserNames, 
     @RoleNames, 
     @CurrentTimeUtc 

SELECT @return_value 
END 

GO 

现在我可以用编译器检查数以及存储过程中的参数类型。

0

Qub1n嗨,

// Create the gender parameter var param1 = new SqlParameter { 
    ParameterName = "@userId", 
    Value = _userId }; 

    // Create the return code var returnValue = new SqlParameter { 
    ParameterName = "@ReturnCode", 
    SqlDbType = System.Data.SqlDbType.Int, 
    Direction = System.Data.ParameterDirection.Output }; 


    // Gender is an int column in the database. 
    _context 
    .Database 
    .ExecuteSqlCommand("exec @ReturnCode = GetGenderOfUser  @userId", 
    param1, returnValue); 

    return (int)returnValue.Value; 

这对我的作品。我的存储过程是这样的:

CREATE PROCEDURE [dbo].[GetGenderOfUser] 
    -- Add the parameters for the stored procedure here 
    @userId uniqueidentifier 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    declare @retval int 
    -- Insert statements for procedure here 
    set @retval = (select top(1) Gender from Users where Guid = @userId) 

    return @retval 
END 

让我知道这是否工作!

+0

最后我最终解决了上面的问题。 ExecuteSqlCommand可以工作,但我无法从数据库自动生成/更新模型。 – qub1n

相关问题