1

我修改了用户类并在 Visual Studio 2012 的包管理器控制台中创建了数据迁移。数据迁移包括以下脚本:

            CreateTable(
            "dbo.Users",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Username = c.String(nullable: false),
                    Comment = c.String(),
                    EmailAddress = c.String(maxLength: 64),
                    Identifier = c.String(),
                    IsApproved = c.Boolean(nullable: false),
                    PasswordFailuresSinceLastSuccess = c.Int(nullable: false),
                    LastPasswordFailureDate = c.DateTime(),
                    LastActivityDate = c.DateTime(),
                    LastLockoutDate = c.DateTime(),
                    LastLoginDate = c.DateTime(),
                    ConfirmationToken = c.String(),
                    CreateDate = c.DateTime(),
                    IsLockedOut = c.Boolean(nullable: false),
                    LastPasswordChangedDate = c.DateTime(),
                    PasswordVerificationToken = c.String(),
                    PasswordVerificationTokenExpirationDate = c.DateTime(),
                    PersonId = c.Int(nullable: false),
                    OwnerId = c.Int(nullable: false),
                    EffectiveDate = c.DateTime(nullable: false),
                    ExpirationDate = c.DateTime(),
                    CreationDate = c.DateTime(nullable: false),
                    UpdatedDate = c.DateTime(nullable: false),
                    Creator = c.String(nullable: false),
                    Updater = c.String(nullable: false),
                    AlertConfiguration_Id = c.Int(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.People", t => t.PersonId, cascadeDelete: false)
            .ForeignKey("dbo.AlertConfigurations", t => t.AlertConfiguration_Id)
            .Index(t => t.PersonId)
            .Index(t => t.AlertConfiguration_Id);

运行迁移后,在数据库中成功创建了 User 表,并显示了所有列。但是,对数据库的后续查询会生成以下错误:

Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'OwnerId'.
Invalid column name 'EffectiveDate'.
Invalid column name 'ExpirationDate'.
Invalid column name 'CreationDate'.
Invalid column name 'UpdatedDate'.
Invalid column name 'Creator'.
Invalid column name 'Updater'.

用户类继承自 AuditableClass,其定义如下:

public abstract class AuditableClass
    {
        public AuditableClass()
        {
            this.CreationDate = System.DateTime.Now;
        }

        [ScaffoldColumn(false)]
        public int Id { get; set; }

        [Required(ErrorMessage = "An owner ID is required")]
        [ScaffoldColumn(false)]
        public int OwnerId { get; set; }

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Effective Date")]
        [Required(ErrorMessage = "An effective date is required")]
        [DataType(DataType.Date)]
        public DateTime? EffectiveDate { get; set; }

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Expiration Date")]
        [DataType(DataType.Date)]
        public DateTime? ExpirationDate { get; set; }

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Required(ErrorMessage = "An creation date is required")]
        [ScaffoldColumn(false)]
        public DateTime? CreationDate { get; set; }

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Required(ErrorMessage = "A last update date is required")]
        [ScaffoldColumn(false)]
        public DateTime? UpdatedDate { get; set; }

        [Required(ErrorMessage = "An creator is required")]
        [ScaffoldColumn(false)]
        public string Creator { get; set; }

        [Required(ErrorMessage = "A last updater is required")]
        [ScaffoldColumn(false)]
        public string Updater { get; set; }
    }

这是用户类:

public class User : AuditableClass
    {
        [Required]
        public virtual String Username { get; set; }

        [DataType(DataType.MultilineText)]
        public virtual String Comment { get; set; }

        [Display(Name = "Email Address")]
        [StringLength(64)]
        public string EmailAddress { get; set; }

        public string Identifier { get; set; }
        public Boolean IsApproved { get; set; }
        public int PasswordFailuresSinceLastSuccess { get; set; }
        public DateTime? LastPasswordFailureDate { get; set; }
        public DateTime? LastActivityDate { get; set; }
        public DateTime? LastLockoutDate { get; set; }
        public DateTime? LastLoginDate { get; set; }
        public String ConfirmationToken { get; set; }
        public DateTime? CreateDate { get; set; }
        public Boolean IsLockedOut { get; set; }
        public DateTime? LastPasswordChangedDate { get; set; }
        public String PasswordVerificationToken { get; set; }
        public DateTime? PasswordVerificationTokenExpirationDate { get; set; }
        public virtual List<Role> Roles { get; set; }
        public virtual List<myApp.Models.Parties.Org> AuthorizedOrgs { get; set; }
        public virtual List<myApp.Models.Security.Permission> Permissions { get; set; }

        public int PersonId { get; set; }
        public virtual Person Person { get; set; }
}

System.Data.SqlClient.SqlException 的主题列都继承自 AuditableClass。

如何让实体框架识别继承的列?

4

1 回答 1

0

发现问题了,原来是User对象包含了一个Roles集合,这个集合是在运行时实例化用户的时候动态加载的。与 Role 类对应的 Roles 表最初也是安全模式的一部分,并在移动 Users 表的同时被移动到事务模式中。Roles 表是使用包管理器控制台的自动数据迁移功能创建的。此功能已创建表,但错过了继承的列(角色也继承自 AuditableClass)。

创建数据迁移,然后输入代码手动创建自动迁移遗漏的列解决了这个问题。

这是解决问题的迁移代码:

    public partial class UpdateRoles : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Roles", "OwnerId", c => c.Int(nullable: false));
        AddColumn("dbo.Roles", "EffectiveDate", c => c.DateTime(nullable: false));
        AddColumn("dbo.Roles", "ExpirationDate", c => c.DateTime());
        AddColumn("dbo.Roles", "CreationDate", c => c.DateTime(nullable: false));
        AddColumn("dbo.Roles", "UpdatedDate", c => c.DateTime(nullable: false));
        AddColumn("dbo.Roles", "Creator", c => c.String(nullable: false, defaultValue: "myusername"));
        AddColumn("dbo.Roles", "Updater", c => c.String(nullable: false, defaultValue: "myusername"));
    }

    public override void Down()
    {
    }
}
于 2012-12-19T00:19:17.470 回答