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 から継承されます。

継承された列をEntity Frameworkに認識させるにはどうすればよいですか?

4

1 に答える 1

0

問題が見つかったのは、User オブジェクトに Roles コレクションが含まれていることでした。このコレクションは、ユーザーがインスタンス化されたときに実行時に動的にロードされました。Role クラスに対応する Roles テーブルも、もともとセキュリティ スキーマの一部であり、Users テーブルが移動されると同時にトランザクション スキーマに移動されました。Roles テーブルは、Package Manager Console の自動データ移行機能を使用して作成されています。この機能によってテーブルが作成されましたが、継承された列がありませんでした (Role は 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 に答える