2015-08-05 15 views
5

Ben özelliklerinin çok var bazı büyük sınıflar ile çalışıyorum, ve tüm özellikleri göz ardı etmek zorunda istemiyorum ben kaydetmek istemiyorum belirtilenlerin dışındaki tüm özelliklerini göz ardı veri tabanı. Aksine, tüm özellikleri görmezden gelmek ve sadece istediklerimi belirtmek için var mı?Varlık Framework - Kod İlk -

Bunun yerine bu

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    // code to ignore properties i don't want one at a time, i.e. 
    mb.Entity<Person>().Ignore(i => i.Name); 
    mb.Entity<Person>().Ignore(i => i.Birthday); 
} 

I

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    // code to ignore all properties 
    // code to include only properties I want 
} 
+0

Bu neden sorun oluyor takım içerikler sağlayabilir mi? Diğer bir deyişle, özellikleri bu şekilde görmezden gelmek istediğiniz verileri nasıl kaydediyorsunuz? –

+1

modelinde olası geçici çözüm here.include gerekli özellikleri olabilir ancak ViewModel özelliklerini göz ardı ve ebay SDK ile çalışıyorum @BrendanGreen (ihmal özelliklere sahip) görünümü modelinde – ManirajSS

+0

tüm özelliklere sahip olan. Çok fazla sınıf var, bunların hiçbiri belirtilen anahtarlara sahip olmayan birçok mülk var. Veritabanına sadece az miktarda veri kaydetmek istiyorum. İstediğim her şeyi görmezden gelmek yerine, sadece ne istediğimi seçebilmek için çok zaman kazandıracağım. – user3012633

cevap

4

İhtiyacınız olanlar dışındaki tüm özellikler için Ignore yöntemini çağırmak için yansıma kullanabilirsiniz olurdu. Böyle bir uzatma yöntemi oluşturarak elde edilebilir:

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

Öncelikle biz bir ayarlayıcı vardır sınıfın bütün özelliklerini ayıklamak (daha kısıtlamaları varsa, en orada bunları sağlamak) ve ait olmayan Özel durum listesine, o özellik yoksaymak için her özellik için EntityTypeConfiguration<TEntityType> sınıfının Ignore yöntemini çağırırız.

Ignore yöntemi çağırmak için, jenerik sınıf türünü edinip sınıfın Ignore yöntemi bulmak, sonra Ignore yöntemin genel tür sağlamak ve son olarak uygun argüman bunu çağırmak gerekir.

Ignore yönteminin argümanı, TEntityType sınıfından istenen özelliği seçen bir lambda ifadesi oluşturarak elde edilir.

bu uzantı sınıfı tanımladıktan sonra, böyle IgnoreAllExcept çağırabilirsiniz:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<TestClass>().IgnoreAllExcept("Id", "Name"); 
} 

Ayrıca sınıfının özelliklerini seçer ifadelere except parametresini değiştirerek, bu yöntemi geliştirebilir.