Utilisez StructuralTypeConfiguration.Ignore () d’Entity Framework pour ignorer toutes les propriétés mais l’ensemble spécifié

Dans l’API EF CodeFirst Fluent, je peux écrire quelque chose comme ceci:

modelBuilder.Entity() .Ignore(e => e.Property1); modelBuilder.Entity() .Ignore(e => e.Property2); 

Comment ignorer toutes les propriétés sauf un ensemble minuscule, comme ceci:

 modelBuilder.Entity() .IgnoreAllBut(e => e.ID, e => e.Important); 

Est-il possible d’écrire une méthode d’extension comme celle-ci IgnoreAllBut ?

C’est brouillon, mais ça marche:

 public static void IgnoreAllBut( this StructuralTypeConfiguration configuration, params Expression>[] includes) where TStructuralType : class { var includeMembers = ConvertExpressionsToMembers(includes); var type = typeof(TStructuralType); var properties = type.GetProperties(); var typeParameter = Expression.Parameter(type); var configurationType = configuration.GetType(); var ignoreMethod = configurationType.GetMethod("Ignore"); foreach (var property in properties) { if (!includeMembers.Any(member => member.Name == property.Name)) { var propertyExpression = Expression.Property(typeParameter, property); var lambdaExpression = Expression.Lambda(propertyExpression, typeParameter); var genericIgnoreMethod = ignoreMethod.MakeGenericMethod(property.PropertyType); var parameters = new object[] { lambdaExpression }; genericIgnoreMethod.Invoke(configuration, parameters); } } } private static List ConvertExpressionsToMembers( Expression>[] expressions) { var members = new List(); foreach (var lambda in expressions) { var expression = lambda.Body; var memberExpression = expression as MemberExpression; if (memberExpression == null) { var unaryExpression = expression as UnaryExpression; memberExpression = unaryExpression.Operand as MemberExpression; } members.Add(memberExpression.Member); } return members; } 

Merci à DarkGray pour le code en question liée.