我正在尝试为 ApplicationUser (ASP.NET Identity, MVC5) 添加一个必需的属性
这是一个简单的例子:
public class ApplicationUser : IdentityUser
{
[Required]
public string FirstName { get; set; }
}
该字段是在数据库中创建的,但最终为NULLABLE
我希望该字段不是 NULL。
知道如何解决这个问题吗?
我正在尝试为 ApplicationUser (ASP.NET Identity, MVC5) 添加一个必需的属性
这是一个简单的例子:
public class ApplicationUser : IdentityUser
{
[Required]
public string FirstName { get; set; }
}
该字段是在数据库中创建的,但最终为NULLABLE
我希望该字段不是 NULL。
知道如何解决这个问题吗?
Table per Hierarchy (TPH) 映射是 Entity Framework Code First 中的默认设置。这意味着如果共享同一个表的类型层次结构中的所有类都不需要 FirstName,则该列不能为非空。
如果您希望 FirstName 列不可为空,则可以选择不同的映射策略。如果您改为使用按类型表 (TPT),那么您将拥有一个用于 IdentityUser(默认为 AspNetUsers)的表和另一个用于 ApplicationUser 的表。由于 FirstName 现在对于 ApplicationUser 表是唯一的,因此它可以是不可为空的。
要使用 TPT,您可以像这样覆盖 OnModelCreating 方法:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().ToTable("ApplicationUser");
}
这更像是对上面@Number8 的评论(目前不允许评论)。我遇到了同样的问题,这可能与 OP 的问题有关。数据库更新检查迁移的配置类 (Configuration.cs)。如果你有一个种子方法,你需要在你的种子方法中为非空属性设置默认值(或者让它们在模型中可以为空)。
通过结合此处和此处的答案找到了一种方法
最终的解决方案对我来说真的违反直觉。
看来您需要为 ApplicationUser 显式地拥有一个单独的表名。
此外,您必须确保首先调用 base.OnModelCreating(modelBuilder)如果
您不这样做,该字段将永远不会尊重 [Required] 属性的 NOT NULL 方面。
这是我使用的代码,它最终得到了这个工作:
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<IdentityUser>().ToTable("Users"); // Won't work if the table name is the same.
modelBuilder.Entity<ApplicationUser>().ToTable("Users")
.Property(p => p.FirstName).IsRequired();
}
// etc.
}
这导致以下数据库结构:
通过将以下行添加到 configuration.cs 文件中的种子方法,我能够使这样的字段不为空
context.Database.ExecuteSqlCommand("ALTER TABLE [AspNetUsers] ALTER COLUMN [FirstName] nvarchar(MAX) NOT NULL");
我尝试使用 Required 属性在 IdentityUser 中添加一个不可为空的字符串字段,并覆盖 OnModelCreating 方法,如下所示:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationUser>().Property(x => x.FirstName).IsRequired();
base.OnModelCreating(modelBuilder);
}
两者都没有成功。我不知道这是设计使然,还是新的 ASP.NET 标识中的错误。我还搜索了相关的错误,但没有成功。
也许添加迁移将帮助您实现您现在需要的。