SQL GetProfileElement-正在将sqlmembership提供程序迁移到标识2.0



我的项目是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"的建议。

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

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

示例:

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

(为了更好的解释,在事后编辑)

正如错误所说,该列不允许空值,但您试图在其中插入null。因此,您需要更改该列以允许插入null。

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

如果该表不是EF为您创建的,则需要修改列以允许null:

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

相关内容

  • 没有找到相关文章