2016-04-12 2 views
1

Mein EntityFramework Kontext ‚System.Data.Entity.DbSet‘ eingeben:Konnte nicht das Objekt von Typ ‚System.Data.Entity.DbSet`1 [Modelname]‘

public class MyContext : DbContext 
{ 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<Contact> Contacts { get; set; } 
    public DbSet<Event> Events { get; set; }   
} 

Meine Methode Objekte hinzufügen :

public void AddObject(DbContext context, Type t, object object_to_add) 
{  
    PropertyInfo context_property = 
      context.GetType().GetProperties() 
      .Where(p => typeof(IEnumerable).IsAssignableFrom(p.PropertyType) 
         && p.PropertyType.GenericTypeArguments.Any() 
         && p.PropertyType.GenericTypeArguments.First() == t) 
      .Single(); 

    DbSet db_set = (DbSet)context_property.GetMethod.Invoke(context, null); 

    db_set.Add(object_to_add); 
} 

aber der Code stürzt ab, wenn ich versuche, eine DbSet<> zu DbSet,

ich bin mit Reflexion zu werfen, weil ich DTO Objekte erhalten, die ich zu einem vorhandenen Modell abzubilden (über reflectio n als auch), ich möchte nicht ein Add-Methode für jedes neue Modell kodieren (ich habe wie 40 und die Liste wächst exponentiell)

Blockquote

eine Lösung?

+0

Ist Ihr Kontext und dieser Code in der gleichen Assembly? –

Antwort

2

Die Verwendung von Reflektion in einer Produktionsumgebung führt zu einer schlechten Leistung. So octaviocci Methode ist in jeder Hinsicht besser.

Allerdings, wenn Sie nicht Ihre Methode generisch machen können, können Sie

public void AddObject(DbContext context, Type t, object object_to_add) 
{ 
    context.Set(t).Add(object_to_add); 
} 

versuchen Sie erhalten InvalidCastException weil System.Data.Entity.DbSet<TEntity> nicht System.Data.Entity.DbSet nicht implementiert.

Siehe die Definition auf https://msdn.microsoft.com/en-us/library/gg696460(v=vs.113).aspx

public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, 
    IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable 
+0

Jeder Serializer/Parser verwendet Reflektion, verwenden Sie nicht einen? und ja, ich benutze Reflexion in der Produktion, funktioniert wie ein Charme dauert 1 Sekunde für 140 Klassen (1000 Objekte), 90% des Codes eliminiert, indexieren Sie nur Objekte. – Akli

+1

@Akli Ich habe auch eine andere eine nicht-generische Lösung enthalten. –

+0

Sehen Sie diesen Beitrag über Auswirkungen der Leistung der Reflexion: http://stackoverflow.com/questions/25458/how-costly-is-net-reflection. IMHO ist es am besten, es so lange wie möglich zu vermeiden. –

4

Ich denke, ist einfacher, wenn Sie eine generische Methode erstellen:

public void AddObject<T>(DbContext context, T object_to_add) 
{ 
    context.Set<T>().Add(object_to_add); 
} 

Yo Set<TEntity> Methode, wie ich oben zeigen können.

+0

Das wird mich zwingen, diesen hässlichen Code zu verwenden: GetMethod ("AddObject"). MakeGenericMethod (t) .Invoke (this, neues Objekt [] {context, object_to_add}); – Akli

+0

Wie auch immer, ich werde deine Antwort akzeptieren, wenn es keine andere Lösung gibt. – Akli

+0

Set ist ein cooles Feature übrigens, wusste es nicht. – Akli

Verwandte Themen