2012-12-18 1 views
1

J'ai modifié la classe d'utilisateurs et créé une migration de données dans la console du gestionnaire de packages de Visual Studio 2012. La migration de données inclus le script suivant:Les requêtes échouent avec des erreurs de "colonne non valide" après l'exécution des migrations de données EF5 vers une base de données SQL Azure

  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); 

Après l'exécution de la migration, la table utilisateur est créé avec succès dans la base de données avec toutes les colonnes indiquées. Cependant, les requêtes ultérieures à la base de données génèrent les erreurs suivantes:

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'. 

La classe utilisateur hérite de AuditableClass, qui est défini comme suit:

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; } 
    } 

Voici la classe utilisateur:

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; } 
} 

Les colonnes qui font l'objet de l'exception System.Data.SqlClient.SqlException sont toutes héritées de AuditableClass.

Comment puis-je obtenir que Entity Framework reconnaisse les colonnes héritées?

+0

Mise à jour - j'ai supprimé la relation héritée et les erreurs persistent, même si les pas des colonnes « invalides » ont plus des attributs correspondants dans l'utilisateur classe. – spadelives

Répondre

0

Vous avez trouvé le problème, c'est que l'objet Utilisateur contient une collection de Rôles, qui a été chargée dynamiquement à l'exécution lorsque l'utilisateur a été instancié. La table Rôles correspondant à la classe Role avait également fait partie du schéma de sécurité et avait été déplacée vers le schéma transactionnel en même temps que la table Users avait été déplacée. La table Rôles a été créée à l'aide de la fonctionnalité de migration automatique des données de la console du gestionnaire de packages. Cette fonctionnalité avait créé la table mais avait manqué les colonnes héritées (Role hérite également de AuditableClass).

La création d'une migration de données, puis la saisie du code pour créer manuellement les colonnes que la migration automatique avait manqué ont résolu le problème.

Voici le code de la migration qui a résolu le problème:

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() 
    { 
    } 
} 
Questions connexes