【问题标题】:What is a Discriminator column in ASP.NET Migrations?什么是 ASP.NET 迁移中的鉴别器列?
【发布时间】:2015-01-20 20:08:17
【问题描述】:

我需要在 ASP.NET MVC 5 中的角色标识表中添加一个额外的字段。

我使用迁移。

我已经为角色添加了一个扩展,例如:

public class ApplicationRole : IdentityRole
{
    public ApplicationRole() : base() { }

    public ApplicationRole(string name)
        : base(name)
    {
    }

    public virtual Project Project { get; set; }
}   

我得到的迁移课程是:

public partial class ProjectToIdentity : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Projects",
            c => new
                {
                    ID = c.Int(nullable: false, identity: true),
                    ProjectName = c.String(maxLength: 100),
                })
            .PrimaryKey(t => t.ID);

        AddColumn("dbo.AspNetRoles", "Discriminator", c => c.String(nullable: false, maxLength: 128));
        AddColumn("dbo.AspNetRoles", "Project_ID", c => c.Int());
        CreateIndex("dbo.AspNetRoles", "Project_ID");
        AddForeignKey("dbo.AspNetRoles", "Project_ID", "dbo.Projects", "ID");
    }

    public override void Down()
    {
        DropForeignKey("dbo.AspNetRoles", "Project_ID", "dbo.Projects");
        DropIndex("dbo.AspNetRoles", new[] { "Project_ID" });
        DropColumn("dbo.AspNetRoles", "Project_ID");
        DropColumn("dbo.AspNetRoles", "Discriminator");
        DropTable("dbo.Projects");
    }
}

问题是 - 什么是鉴别器列?我的模型中没有这样的列。迁移工具为什么要加这个字段,目的是什么?

【问题讨论】:

  • 用于表继承方案。这是一个很好的描述weblogs.asp.net/manavi/…
  • 在这种情况下,有人能够摆脱Discriminator 列吗?我理解为什么 EF 添加它,但就我而言,我只想保留 ApplicationRole - 不会有 IdentityRoles。如果可以的话,我会使用 abstract,但它在 nuget 包中,所以这是不可能的。

标签: asp.net .net asp.net-mvc entity-framework entity-framework-migrations


【解决方案1】:

嗯,一个快速的答案可以理解,或者,至少,让它更清楚。

正如 Jasen 所说,您可以在http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph 或任何其他链接上阅读Table per Hierarchy (TPH)。但是,说实话,从第一次开始就没那么容易理解了。

这里是一个快速的答案:

  1. 尝试使用继承自 IdentityRole 的 ApplicationRole(已发布的类)创建一个新角色
  2. 创建新角色后,请查看歧视字段。

如您所见 - 新记录在 Discrimination 列中包含“ApplicationRole”。可以这么说 - 该列包含继承 IdentityRole 的新类的名称。 因此,可能会有更多类继承 IdentityRole,但对于每条记录,身份系统将存储值 - 使用创建记录的类。

如图所示,ApplicationRole Discriminator 仅针对记录出现,由继承 IdentityRole 的名为 ApplicationRole 的类创建。

【讨论】:

  • 在阅读您的回答之前,我没有意识到 EF/ASP.NET 会计划为多个项目使用一个表。这也是为什么即使我设置了 [Required] 属性,它也没有将我的附加列设置为不可为空的原因吗?我不应该在我的迁移中手动将其设置为不可为空吗?
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
  • 2023-03-31
  • 2019-02-14
  • 2020-04-05
  • 2020-01-02
  • 2014-04-27
相关资源
最近更新 更多