Obtenir les propriétés ignorées dans Entity Framework

Je travaille sur un cadre avec EF. Je veux obtenir toutes les propriétés ignorées d’une entité pour construire des requêtes spéciales. Comment puis-je le faire?

public class Customer { public int Id { get; set; } public DateTime BirthDate { get; set; } public int Age { get; set; } } public class CustomerContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Ignore(customer => customer.Age); base.OnModelCreating(modelBuilder); } public DbSet Customers { get; set; } } public static class DbContextExtensions { public static List GetIgnoredProperties(this DbContext context, ssortingng entityTypeName) { // ??? } } 

Je sais que cela ne répond pas à votre question initiale, et dans mes commentaires, j’ai indiqué que vous devriez utiliser la reflection, mais c’est uniquement parce que j’ai mal lu votre question.

Voici une alternative en utilisant la reflection, car si vous ne vous trompez pas.

Si vous affectez l’atsortingbut [NotMapped] aux propriétés de votre classe que vous souhaitez ignorer, vous pouvez éventuellement extraire toutes les propriétés [NotMapped] aide de la reflection. Vous trouverez ci-dessous un exemple de la façon dont cela pourrait être réalisé.

 var resultArray = yourClassInstance.GetType().GetProperties() .Where(prop => Atsortingbute.IsDefined(prop, typeof(NotMappedAtsortingbute))); 

J’espère que cela vous aide d’une certaine manière.

Vous pouvez obtenir ce que vous voulez en appelant le fichier DbModelBuilder.Build . Il créera une base DbModel lors de la configuration par DbModelBuilder . DbModel expose un ConceptualModel contenant les types utilisés par le contexte. Le EdmModel contient chaque type déclaré dans le contexte et, pour chaque type, les propriétés qui n’ont pas été ignorées par DbModelBuilder lors de sa configuration. Donc, pour obtenir ce que vous voulez, vous devez intersecter les propriétés de chaque type d’entité avec celles présentes dans EdmModel . Cela donnera le delta entre eux, donc les propriétés ignorées. Voici un exemple:

 public class CustomerContext : DbContext { private static IReadOnlyDictionary> _ignoredProperties; /// Hold the ignored properties configured from fluent mapping public static IReadOnlyDictionary> IgnoredProperties { get { return _ignoredProperties; } } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Ignore(customer => customer.Age); // Build ignored properties only if they are not if (_ignoredProperties == null) { var model = modelBuilder.Build(this.Database.Connection); var mappedEntityTypes = new Dictionary>(); foreach (var entityType in model.ConceptualModel.EntityTypes) { var type = Type.GetType(entityType.FullName); var typeProperties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); var mappedProperties = entityType.DeclaredProperties.Select(t => t.Name) .Union(entityType.NavigationProperties.Select(t => t.Name)); mappedEntityTypes.Add(type, new ReadOnlyCollection( typeProperties.Where(t => !mappedProperties.Contains(t.Name)).ToList())); } _ignoredProperties = new ReadOnlyDictionary>(mappedEntityTypes); } base.OnModelCreating(modelBuilder); } public DbSet Customers { get; set; } } 

La propriété IgnoreProperties est un singleton qui sera initialisé la première fois que vous utiliserez le contexte. Il sera nul avant cela, vous devrez donc vous assurer que rien ne l’utilisera jusqu’à ce qu’il soit initialisé. En lecture seule, vous n’avez donc pas à vous inquiéter de la suppression accidentelle de la collection. Le type d’entité est utilisé comme clé et la valeur expose une collection contenant des propriétés ignorées. Exemple d’utilisation:

 var properties = CustomerContext.IgnoredProperties[typeof(Customer)]; 

Les inconvénients :

Selon cette approche, DbModel sera construit deux fois, une fois pour rassembler les propriétés ignorées, et une seconde fois par EntityFramework lorsque DbComstackdModel sera mis en cache pour une création future par ObjectContext . Cela peut avoir un impact sur le démarrage à froid du DbContext , cela signifie que la première fois que vous exécuterez une requête sur votre contexte, ce sera un peu plus lent. Cela dépendra de la taille du DbContext . Les questions chaleureuses ne devraient pas en souffrir. OnModelCreating sera appelé une fois de toute façon .

Avantages :

Toutes les modifications apscopes à la configuration de DbModelBuilder seront automatiquement répercutées dans la propriété IgnoredProperties .