2 votes

Pourquoi EF indique-t-il que mon modèle a changé alors que ce n'est pas le cas ?

Je continue à obtenir l'erreur suivante :

System.InvalidOperationException : Le modèle soutenant le 'McContext' a été rejeté. a changé depuis la création de la base de données. Envisagez d'utiliser Code First Migrations pour mettre à jour la base de données ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

Je suis en train de créer un site Web .NET MVC 5 en utilisant le dernier Entity Framework de nuget, v6.1.3. Je suis attaché à un fichier MDF local car je n'ai pas de SQL Server ou Express installé localement. J'utilise le modèle Code First.

J'ai passé des heures hier et aujourd'hui à passer au peigne fin les articles de SO et de WWW sur cette erreur, mais je n'ai pas trouvé de solution qui fonctionne. La plupart d'entre eux tournent autour de différents types d'initialisateurs, ou de courtes explications sur la façon dont le code nécessite d'abord des migrations ou des initialisateurs pour les changements de modèle. Mais j'exécute la configuration manuellement via la console PM. J'ai inclus mes étapes ci-dessous.

Chaîne de connexion :

<add name="testSQLConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\jwatts\Documents\Visual Studio 2015\Projects\MyProject\Databases\MyProject01.mdf;Integrated Security=True;Connect Timeout=30" providerName="System.Data.SqlClient" />

Le modèle :

public class Family
{
    public Family() { }

    [Key, Index(IsUnique = true)]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [StringLength(128)]
    public string Name { get; set; }

    [StringLength(1024)]
    public string Description { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime? Changed { get; set; }

    public string ChangedBy { get; set; }

    public DateTime? Deleted { get; set; }

    public string DeletedBy { get; set; }
}

Le contexte :

public class McContext : DbContext
{
    public McContext() : base("testSQLConnection") { }

    public DbSet<Family> Families { get; set; }
}

La configuration :

internal sealed class Configuration : DbMigrationsConfiguration<Data.McContext>
{
    public Configuration()
    {
        MigrationsDirectory = @"Data\Migrations";
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(McContext context)
    {
        context.Families.Add(new Family()
        {
            Name = "My Family",
            Description = "The family",
            Created = DateTime.Now,
            CreatedBy = "system"
        });
        context.SaveChanges();
    }
}

Classe de migration générée automatiquement :

public partial class StartupConfig : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Families",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(nullable: false, maxLength: 128),
                    Description = c.String(maxLength: 1024),
                    Created = c.DateTime(nullable: false),
                    CreatedBy = c.String(),
                    Changed = c.DateTime(),
                    ChangedBy = c.String(),
                    Deleted = c.DateTime(),
                    DeletedBy = c.String(),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.Id, unique: true);

    }

    public override void Down()
    {
        DropIndex("dbo.Families", new[] { "Id" });
        DropTable("dbo.Families");
    }
}

Code de test unitaire :

[TestMethod]
public void CreateTheContext_Test()
{
    using (var ctx = new McContext())
    {
        //error on this line below:
        var fam = ctx.Families.Where(f => f.Name.Contains("My")).FirstOrDefault();
        Assert.IsTrue(fam != null && fam.Name.Contains("My"));
    }   
}

Les marches de la récréation :

  1. J'ai commencé par faire table rase et j'ai supprimé toutes les tables de ma base de données de test, ainsi que toutes les données. \Migrations.
  2. Reconstruction de la solution. (Le projet de base et un projet de test unitaire)
  3. Dans la console du gestionnaire de paquets, exécutez " Add-Migration StartupConfig "
  4. Un fichier de migration est ajouté aux données \Migrations appelé " {datetime}_StartupConfig.cs ". Voir StartupConfig classe ci-dessus.
  5. J'ai construit le projet.
  6. J'ai couru " Update-Database -TargetMigration:StartupConfig "
  7. La console PM affiche 4 lignes, y compris le message "Running Seed method", et se termine avec succès.
  8. J'ai confirmé via une requête SQL que le " __MigrationHistory " et " Families Les tables " " ont été ajoutées à la base de données, et chaque table a 1 enregistrement.
  9. J'ai exécuté le test unitaire et j'ai reçu l'erreur.

J'avais un modèle plus complexe, mais j'ai commencé à retirer des éléments un par un en rendant les choses aussi simples que possible. Mais je ne peux pas faire plus simple que ça, et pourtant l'erreur persiste. Il convient de noter que, pour ce projet particulier, je n'ai jamais obtenu une requête réussie à partir du test unitaire.

Pendant que j'écrivais ces étapes de récréation ci-dessus, je les exécutais en même temps, et j'ai eu la même erreur.

Je ne sais pas quoi essayer ensuite ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X