Ignorando todas las propiedades pero algunas en Entity Framework 6

Quiero conservar algunos datos en una base de datos utilizando Entity Framework.
Tengo algunos POCO más grandes pero quiero almacenar solo algunas de las propiedades.

Sé que puedo lograr esto con la Fluent API utilizando el método Ignore() . Pero, ¿existe también la posibilidad de no solo ignorar una propiedad definida, sino también todas las propiedades, pero la definida?
Así que si tienes un POCO como este:

 public class MyPoco { public int Id { get; set; } public string Name { get; set; } . . . public int SomeSpecialId { get; set; } } 

Y solo desea almacenar el Id y SomeSpecialId , haría:

 protected override void OnModelCreating(DbModelBuilder builder) { builder.Entity().Ignore(x => x.Name); builder.Entity().Ignore(x => x.WhatEver); . . . // ignore everything but Id and SomeSpecialId base.OnModelCreating(builder); } 

El problema ahora es que si tiene que extender el POCO pero no desea conservar esas propiedades extendidas, también tiene que cambiar el método OnModelCreating() . Entonces, ¿hay una manera de hacer algo como:

 public override void OnModelCreating(DbModelBuilder builder) { builder.Entity().IgnoreAllBut(x => x.Id, x.SomeSpecialId); base.OnModelCreating(builder); } 

Puedes escribir un método de extensión que haga eso. El código no es simple porque necesitas trabajar con árboles de expresiones.

Aquí está su método IgnoreAllBut:

 public static EntityTypeConfiguration IgnoreAllBut(this EntityTypeConfiguration entityTypeConfiguration, params Expression>[] properties) where T : class { // Extract the names from the expressions var namesToKeep = properties.Select(a => { var member = a.Body as MemberExpression; // If the property is a value type, there will be an extra "Convert()" // This will get rid of it. if (member == null) { var convert = a.Body as UnaryExpression; if (convert == null) throw new ArgumentException("Invalid expression"); member = convert.Operand as MemberExpression; } if (member == null) throw new ArgumentException("Invalid expression"); return (member.Member as PropertyInfo).Name; }); // Now we loop over all properties, excluding the ones we want to keep foreach (var property in typeof(T).GetProperties().Where(p => !namesToKeep.Contains(p.Name))) { // Here is the tricky part: we need to build an expression tree // to pass to Ignore() // first, the parameter var param = Expression.Parameter(typeof (T), "e"); // then the property access Expression expression = Expression.Property(param, property); // If the property is a value type, we need an explicit Convert() operation if (property.PropertyType.IsValueType) { expression = Expression.Convert(expression, typeof (object)); } // last step, assembling everything inside a lambda that // can be passed to Ignore() var result = Expression.Lambda>(expression, param); entityTypeConfiguration.Ignore(result); } return entityTypeConfiguration; } 

Puede marcar propiedades individuales como NotMapped dentro de la propia clase.

 public class MyPoco { public int Id { get; set; } [NotMapped] public string Name { get; set; } public int SomeSpecialId { get; set; } } 

No resuelve su problema de ‘ignorar todo menos esto’, pero puede hacer que sea obvio qué se incluye y qué no.