web-dev-qa-db-fra.com

Ignorer les propriétés dans le modèle de données tout en les conservant dans les migrations EF Core

Je crée une application entièrement nouvelle qui utilise EF Core qui doit communiquer avec une base de données héritée. Je veux qu'EF ignore certaines des colonnes de la base de données car elles seront finalement obsolètes et je ne veux pas qu'elles soient dans le nouveau modèle d'entité. Je ne peux pas encore les supprimer car le système hérité repose toujours sur eux.

Pour une colonne de base de données indésirable appelée DeprecatedFeature, je veux faire quelque chose comme:

modelBuilder.Entity<MyEntity>(entity => {
   entity.HasKey(t => t.Id);
   entity.ToTable("MyEntity");
   entity.ColumnIgnore("DeprecatedFeature"); // <-- this is what I want to do
})

Pour le moment, le mieux que je puisse faire est d'inclure la propriété et de la marquer comme obsolète:

public class MyEntity 
{
    public int Id { get; set; }

    [Obsolete("Deprecated in latest version")]
    public string DeprecatedFeature { get; set; }
}

Mais cela signifie que je ne peux pas activer les "avertissements comme erreurs". J'ai encore besoin d'exécuter des migrations sur ma base de données.

Questions similaires: EF 4.x , EF Core skip column on load , sing EF Designer/EDMX and duplicate

Éditer

Je peux voir par les réponses qu'il y a une certaine confusion sur ma question:

NotMapped n'est PAS la réponse

NotMapped est utilisé lorsque vous avez une propriété dans votre modèle que vous ne voulez pas dans la base de données. Mon problème est l'inverse. J'ai une colonne dans ma base de données que je ne veux pas dans mon modèle.

15
Dr Rob Lang

Vous avez deux alternatives:

  1. Utilisation de NotMappedAttribute:

    public class MyEntity
    {
         public int Id { get; set; }    
         [NotMapped]
         public string DeprecatedFeature { get; set; }
    }
    
  2. Utilisation de FluentAPI:

    modelBuilder.Entity<MyEntity>().Ignore(c => c.DeprecatedFeature );

14
Yared

N'incluez simplement pas cette propriété dans votre classe d'entité. EntityFramework devrait alors simplement l'ignorer.

public class MyEntity 
{
    public int Id { get; set; }

    // Remove this property
    //public string DeprecatedFeature { get; set; }
}

Vous devriez pouvoir accéder à cette entité à partir de la base de données sans aucun problème, et votre code d'application n'aura pas accès à la propriété déconseillée. Si vous devez écrire dans ce tableau, la colonne obsolète devra être nullable ou avoir une valeur par défaut.


Éditer:

Vous pouvez créer une propriété d'ombre comme celle-ci:

entity.Property(typeof(string), "DeprecatedFeature");

Cela permettra à EF d'être au courant de la propriété (et de l'inclure dans les migrations), mais la propriété n'a pas besoin d'exister sur le type d'entité.

12
Entith

Il est impossible d'avoir un modèle de données EF à la fois:

  • Une nouvelle version de votre modèle de données, qui mappe uniquement une partie de votre base de données, et
  • Utilise les migrations pour maintenir votre ancienne base de données.

Ce que vous pouvez faire, c'est créer un nouveau modèle de données EF. Vous aurez l'ancienne avec des migrations pour maintenir votre ancienne base de données et la nouvelle, sans migrations, pour votre nouvelle application.

Dans le nouveau, vous pouvez simplement ignorer les colonnes (propriétés) dont vous n'avez pas besoin.

0
Jonatan Dragon