我在 .NET 8 应用程序中遇到一个问题,当存储在数据库中时,尾随空格被附加到固定长度属性 (UserName)。我正在使用数据库提供程序 - Microsoft.EntityFrameworkCore.SqlServer。 我使用 Microsoft.AspNetCore.Identity.EntityFrameworkCore 进行身份存储,其中自定义类继承自身份类。我已按如下方式配置该属性:
public class UserConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> entity)
{
entity.Property(u => u.UserName)
.HasMaxLength(50)
.IsRequired();
但是,在播种过程中,当我创建一个 UserName = "username" 的新 User 对象时,它在数据库中存储为: “用户名(空格直到 50 个字符)” -> 请注意,序列有 50 个字符,它在用户名后面跟随空格,直到达到 50 个字符(由于 SO 的格式,在此处的字符串中无法准确看到)
用户类别:
public class User : IdentityUser<int>
{
// ... UserName inherited from IdentityUser ...
用户配置:
public class UserConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> entity)
{
entity.Property(u => u.UserName)
.HasMaxLength(50)
.IsRequired();
// ... other configurations ...
}
}
播种逻辑:
var admin = new User
{
Id = 1,
FirstName = "John",
LastName = "Doe",
UserName = "username", // No trailing whitespaces here
Email = "[email protected]",
// ... other properties ...
};
modelBuilder.Entity<User>().HasData(users);
上下文类:
public class LibraryContext : IdentityDbContext<User, Role, int>
{
public virtual DbSet<User> Users { get; set; }
我认为它必须与自定义配置和身份配置有关。 请注意,我已尝试删除自定义 UserName 属性配置并将其留给 Identity 自行配置,但问题仍然存在。 即使 UserName 属性配置为 .HasMaxLength(50),为什么尾随空格仍会附加到该属性? 如何确保存储的 UserName 属性没有任何尾随空格?
任何见解或建议将不胜感激。谢谢!
生成的创建用户表脚本:
USE [LibApp]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CreatedDateTime] [datetime2](7) NOT NULL,
[ModifiedDateTime] [datetime2](7) NOT NULL,
[CreatedByUserId] [int] NOT NULL,
[ModifiedByUserId] [int] NOT NULL,
[IsActive] [bit] NOT NULL,
[Address] [nvarchar](100) NULL,
[CardCode] [nvarchar](max) NULL,
[City] [nvarchar](50) NOT NULL,
[Currency] [char](3) NULL,
[DateOfBirth] [datetime2](7) NOT NULL,
[Email] [varchar](50) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[ImagePath] [char](255) NULL,
[IsCardActive] [bit] NOT NULL,
[LastLoginDateTime] [datetime2](7) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Notes] [nvarchar](1000) NULL,
[PhoneNumber] [nvarchar](30) NULL,
[RoleId] [int] NOT NULL,
[TotalFee] [decimal](10, 2) NOT NULL,
[UserName] [varchar](50) NOT NULL,
[AccessFailedCount] [int] NOT NULL,
[ConcurrencyStamp] [nvarchar](max) NULL,
[EmailConfirmed] [bit] NOT NULL,
[LockoutEnabled] [bit] NOT NULL,
[LockoutEnd] [datetimeoffset](7) NULL,
[NormalizedEmail] [nvarchar](256) NULL,
[NormalizedUserName] [nvarchar](256) NULL,
[PasswordHash] [nvarchar](max) NULL,
[PhoneNumberConfirmed] [bit] NOT NULL,
[SecurityStamp] [nvarchar](max) NULL,
[TwoFactorEnabled] [bit] NOT NULL,
[DocumentId] [nvarchar](13) NOT NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[User] ADD DEFAULT (N'') FOR [DocumentId]
GO
ALTER TABLE [dbo].[User] WITH CHECK ADD CONSTRAINT [FK_User_Role_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Role] ([Id])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_Role_RoleId]
GO
ALTER TABLE [dbo].[User] WITH CHECK ADD CONSTRAINT [FK_User_User_CreatedByUserId] FOREIGN KEY([CreatedByUserId])
REFERENCES [dbo].[User] ([Id])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_User_CreatedByUserId]
GO
ALTER TABLE [dbo].[User] WITH CHECK ADD CONSTRAINT [FK_User_User_ModifiedByUserId] FOREIGN KEY([ModifiedByUserId])
REFERENCES [dbo].[User] ([Id])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_User_ModifiedByUserId]
GO