Sie Reflexion verwenden können, um Ignore
Methode für alle Eigenschaften mit Ausnahme derjenigen zu nennen, die Sie benötigen. Es kann durch die Schaffung eines Erweiterungsmethode wie dies erreicht werden:
public static class EntityTypeConfigurationExtentions
{
public static EntityTypeConfiguration<TEntityType> IgnoreAllExcept<TEntityType>
(this EntityTypeConfiguration<TEntityType> t, params string[] except)
where TEntityType:class
{
var type = typeof(TEntityType);
var properties = type.GetProperties();
var dontIgnore = except ?? new string[0];
//Here you can add more constraints on the class properties
var toIgnore = properties.Where(x => !except.Contains(x.Name) &&
x.SetMethod != null).ToList();
foreach (var name in toIgnore)
{
var selector = GetIgnoreExpression<TEntityType>(name);
MethodInfo genericMethod = GetIgnoreMethod<TEntityType>(name.PropertyType);
genericMethod.Invoke(t, new object[] { selector });
}
return t;
}
private static MethodInfo GetIgnoreMethod<TEntityType>(Type propType)
{
var t = typeof(EntityTypeConfiguration<>);
t = t.MakeGenericType(typeof(TEntityType));
MethodInfo method = t.GetMethod("Ignore");
MethodInfo genericMethod = method.MakeGenericMethod(propType);
return genericMethod;
}
//This method creates the 'x=>x.PropertyName' expression for Ignore method
private static Expression GetIgnoreExpression<TEntityType>(PropertyInfo prop)
{
ParameterExpression arg = Expression.Parameter(typeof(TEntityType), "x");
MemberExpression property = Expression.Property(arg, prop.Name);
var exp = Expression.Lambda(property, new ParameterExpression[] { arg });
return exp;
}
}
Zuerst extrahieren wir alle Eigenschaften der Klasse, die einen Setter hat (, wenn Sie weitere Einschränkungen haben, können Sie sie am meisten bieten dort) und nicht gehören zu der Ausnahmeliste, dann rufen wir Ignore
Methode der EntityTypeConfiguration<TEntityType>
Klasse für jede Eigenschaft, um diese Eigenschaft zu ignorieren.
die Ignore
Methode aufzurufen, müssen wir die generische Klasse-Typ, und dann finden die Ignore
Methode der Klasse erhalten, geben Sie dann die Gattung des Ignore
Methode, und es schließlich durch das entsprechende Argument aufrufen. Das Argument der Ignore
-Methode wird durch Erstellen eines Lambda-Ausdrucks erhalten, der die gewünschte Eigenschaft aus der Klasse TEntityType
auswählt.
Nach dieser Erweiterung Klasse definieren, können Sie die IgnoreAllExcept
wie folgt aufrufen:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TestClass>().IgnoreAllExcept("Id", "Name");
}
Sie können auch dieses Verfahren verbessern, indem die except
Parameter Ausdrücke zu ändern, die die Eigenschaften der Klasse auswählt.
Können Sie einen Kontext dafür angeben, warum dies ein Problem ist? Mit anderen Worten, wie speichern Sie die Daten, die dazu führen, dass Sie die Eigenschaften auf diese Weise ignorieren möchten? –
mit ignorierten Eigenschaften nur in Viewmodel könnte möglicherweise Workaround hier.include notwendigen Eigenschaften im Modell und haben alle Eigenschaften im View-Modell (mit ignorierten Eigenschaften) – ManirajSS
@ BrendanGreen Ich arbeite mit dem ebay SDK. Es gibt viele Klassen, sie haben viele Eigenschaften, von denen keine Schlüssel angegeben sind. Ich möchte nur eine kleine Menge von Daten in der Datenbank speichern. Es würde viel Zeit sparen, nur das zu wählen, was ich will, anstatt alles ignorieren zu müssen, was ich nicht will. – user3012633