4

我正在尝试为 ApplicationUser (ASP.NET Identity, MVC5) 添加一个必需的属性

这是一个简单的例子:

public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstName { get; set; }
}

该字段是在数据库中创建的,但最终为NULLABLE
我希望该字段不是 NULL。

在此处输入图像描述

知道如何解决这个问题吗?

4

5 回答 5

8

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");
}
于 2013-11-06T20:10:19.690 回答
0

这更像是对上面@Number8 的评论(目前不允许评论)。我遇到了同样的问题,这可能与 OP 的问题有关。数据库更新检查迁移的配置类 (Configuration.cs)。如果你有一个种子方法,你需要在你的种子方法中为非空属性设置默认值(或者让它们在模型中可以为空)。

于 2013-12-25T07:50:23.927 回答
0

通过结合此处此处的答案找到了一种方法

最终的解决方案对我来说真的违反直觉。
看来您需要为 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.
}

这导致以下数据库结构:

在此处输入图像描述

于 2013-11-06T20:57:46.587 回答
0

通过将以下行添加到 configuration.cs 文件中的种子方法,我能够使这样的字段不为空

context.Database.ExecuteSqlCommand("ALTER TABLE [AspNetUsers] ALTER COLUMN [FirstName] nvarchar(MAX) NOT NULL");

于 2013-11-16T05:30:34.533 回答
0

我尝试使用 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 标识中的错误。我还搜索了相关的错误,但没有成功。

也许添加迁移将帮助您实现您现在需要的。

于 2013-11-06T18:14:56.767 回答