SQL GetProfileElement - 将sqlmembership提供程序迁移到identity 2.0

时间:2014-11-12 19:20:30

标签: sql-server asp.net-mvc asp.net-identity sqlmembershipprovider

我的项目是MVC5,我正在尝试将用户数据从SqlMembership Provider导入Identity 2.0。 我正在使用:

dbo.fn_GetProfileElement('FirstName',Prfl.PropertyNames,Prfl.PropertyValuesString) FirstName,

我收到以下错误:

Cannot insert the value NULL into column 'FirstName', table 'bcrs_new.dbo.AspNetUsers'; column does not allow nulls. INSERT fails.

这是功能:

ALTER FUNCTION [dbo].[fn_GetProfileElement]
(
@fieldName AS NVARCHAR(100),
@fields AS NVARCHAR(4000),
@values AS NVARCHAR(4000))

RETURNS NVARCHAR(4000)
AS
BEGIN
  -- If input is invalid, return null.
  IF @fieldName IS NULL
      OR LEN(@fieldName) = 0
      OR @fields IS NULL
      OR LEN(@fields) = 0
      OR @values IS NULL
      OR LEN(@values) = 0

    RETURN NULL

-- locate FieldName in Fields
DECLARE @fieldNameToken AS NVARCHAR(20)
DECLARE @fieldNameStart AS INTEGER,
@valueStart AS INTEGER,
@valueLength AS INTEGER

-- Only handle string type fields (:S:)
SET @fieldNameStart = CHARINDEX(@fieldName + ':S',@Fields,0)

-- If field is not found, return null
IF @fieldNameStart = 0 RETURN NULL
SET @fieldNameStart = @fieldNameStart + LEN(@fieldName) + 3

-- Get the field token which I've defined as the start of the
-- field offset to the end of the length
SET @fieldNameToken = SUBSTRING(@Fields,@fieldNameStart,LEN(@Fields)-@fieldNameStart)

-- Get the values for the offset and length
SET @valueStart = dbo.fn_getelement(1,@fieldNameToken,':')
SET @valueLength = dbo.fn_getelement(2,@fieldNameToken,':')

-- Check for sane values, 0 length means the profile item was
-- stored, just no data
IF @valueLength = 0 RETURN ''

-- Return the string
RETURN SUBSTRING(@values, @valueStart+1, @valueLength)

END

我很感激您就如何检查FirstName是否为空插入“NA”的建议。

2 个答案:

答案 0 :(得分:1)

正如trailmax所指出的那样,问题是您正在尝试将null插入到不接受空值的列中。有两种可能的解决方案。一种是修改表以允许空值。如果表中已有数据,则可能存在此问题。另外,您可能是软件开发人员,而不是数据架构师。所以这可能不太可行。

我喜欢在SQL中使用isnull()函数,它大致相当于C#中的null coallescing运算符(??)。 isnull(parm1,parm2)如果不为null则返回parm1,否则返回parm 2.

一个例子:

declare @myVar int
set @myVar  = null
select isnull(@myVar, 1)    
-- Returns 1
set @myVar  = 2
select isnull(@myVar, 1)   
-- Returns 2 

所以将此应用于您的代码段:

isnull(dbo.fn_GetProfileElement('FirstName',Prfl.PropertyNames,Prfl.PropertyValuesString),'NA') FirstName

(事后编辑了这个以获得更好的解释)

答案 1 :(得分:0)

如错误所示,该列不允许空值,但您尝试在那里插入null。因此,您需要更改该列以允许插入空值。

如果此表是由EF为您生成的,那么在您的模型中,您需要从属性[Required]中删除FirstName。然后创建一个新的迁移,修改数据库状态并再次尝试您的脚本。

如果EF没有为您创建该表,则需要修改列以允许空值:

ALTER TABLE bcrs_new.dbo.AspNetUsers
ALTER COLUMN FirstName nvarchar(max) NULL