我正在将Simple Membership数据库迁移到Identity 2.0。我将CreateDate datetime NULL
列复制到CreateDate datetime NOT NULL
列。我检查了数据源表中Membership.CreateDate列中的所有记录,以验证它们是否包含有效的DateTimes。返回此错误:
Cannot insert the value NULL into column 'CreateDate', table 'Settlement.dbo.AspNetUsers'; column does not allow nulls. INSERT fails.
The statement has been terminated.
我还尝试删除成员资格中的所有记录但只有一个(其CreateDate列包含2012-12-27 01:35:03.610
)。我得到了同样的错误。
我在SSMS中运行脚本。
迁移脚本摘录:
CREATE TABLE [dbo].[AspNetUsers] (
[Id] [nvarchar](60) NOT NULL,
[UserName] [nvarchar](15) NOT NULL,
[AcId] INT NOT NULL,
[LocId] INT NOT NULL,
[CreateDate] [datetime] NOT NULL,
[Email] [nvarchar](60),
[EmailConfirmed] [bit] Default ((0)) NOT NULL,
[PasswordHash] [nvarchar] (100),
[SecurityStamp] [nvarchar] (60),
[PhoneNumber] [nvarchar] (15),
[PhoneNumberConfirmed] [bit] Default ((0)) NOT NULL,
[TwoFactorEnabled] [bit] Default ((0)) NOT NULL,
[LockoutEndDateUtc] [datetime],
[LockoutEnabled] [bit] Default ((0)) NOT NULL,
[AccessFailedCount] [int] Default ((0)) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY ([Id])
);
GO
INSERT INTO AspNetUsers(Id, UserName, AcId, LocId, PasswordHash, SecurityStamp, CreateDate )
SELECT UserProfile.UserId, UserProfile.UserName, UserProfile.BaId, UserProfile.OfcId,
webpages_Membership.Password, webpages_Membership.PasswordSalt, webpages_Membership.CreateDate
FROM UserProfile
LEFT OUTER JOIN webpages_Membership ON UserProfile.UserId = webpages_Membership.UserId
GO
如果我将AspNetUsers CreateDate列更改为NULL,它会成功地将日期时间从表复制到表,因此我知道所有列名称和类型都是正确的。
(这样做之后我跑了
ALTER TABLE [dbo].[AspNetUsers] ALTER COLUMN [CreateDate] datetime NOT NULL
并得到了相同的错误)
这与数据库的Production副本一起发生。我有一个通过相同的EF代码第一个代码生成的数据库的开发副本,它成功地将数据复制到CreateDate NOT NULL字段。
我此时的智慧已经结束了。当源数据是有效日期时,为什么我会收到Cannot insert the value NULL into column
错误?或者为什么它不将CreateDate列数据识别为有效日期时间?
答案 0 :(得分:1)
UserProfile
中有一些用户webpages_Membership
中没有相应的用户,因此您尝试插入没有任何信息的用户。您必须使用INNER JOIN
代替LEFT OUTER JOIN
,或为没有相应信息的用户提供默认值。