使用Entity Framework的StructuralTypeConfiguration.Ignore()忽略除指定集之外的所有属性

在EF CodeFirst Fluent API中,我可以这样编写:

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

如何忽略所有的属性,但一小部分,如下:

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

是否可以编写像这样的IgnoreAllBut扩展方法?

这是草案,但有效:

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

感谢DarkGray提供链接问题中的代码。