2016-03-28 5 views
2

Ich bin mir nicht sicher in Bezug auf die genaue technische Spezifikation für dieses Problem, aber in einfachen Worten versuche ich eine Wrapper/Extension-Methode um meine Entitäten zu speichern.EntityObject zu DbContext

Also habe ich eine neue Entity Data Model (.edmx) Datei zu meinem Projekt hinzugefügt. Das erzeugt DbSet (n) wie this-

public partial class SUContextContainer : DbContext 
    { 
     public SUContextContainer() 
      : base("name=SUContextContainer") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public DbSet<Category> Categories { get; set; } 
     public DbSet<Gallery> Galleries { get; set; } 
     public DbSet<SuperUser> SuperUsers { get; set; } 
     public DbSet<UserType> UserTypes { get; set; } 
    } 

Hier versuche ich, diese in eine Erweiterungsmethode umhüllen für Datenbankoperationen wie (speichern, löschen, aktualisieren etc ..)

habe ich versucht, es zu schaffen as -

public static void Save(this EntityObject objEntity) 
     { 
      try               // Update Record 
      { 
       ((IObjectContextAdapter)Global.Context).ObjectContext.ObjectStateManager.ChangeObjectState(objEntity, EntityState.Modified); 
       Global.Context.SaveChanges(); 
      } 
      catch (OptimisticConcurrencyException)      // Insert Record 
      { 
       ((IObjectContextAdapter)Global.Context).ObjectContext.ObjectStateManager.ChangeObjectState(objEntity, EntityState.Added); 
       Global.Context.SaveChanges(); 
      } 
     } 

Diese Methode ist an EntityObject-Typen angehängt. Wo .edmx-Code, den es generiert, sind vom Typ DbContext.

Also immer wenn ich versuche, irgendeine Entität mit dieser Hilfsmethode zu speichern, findet es nie heraus.

var galleryEntity = new Gallery { 
     IsActive = true, 
     CategoryId = model.CategoryId, 
    }; 
    galleryEntity.Save(); // the save method is not found. 

ich oben Methode versuchte sich ändern -

public static void Save(this DbSet objEntity) 

Aber das scheint auch nicht als Erweiterungsmethode zu nehmen. Was mache ich falsch?

+1

Erbt Gallery von EntityObject und haben Sie eine using-Anweisung zur Quelldatei hinzugefügt? –

+0

@GlenThomas, Nein, erbt nicht von EntityObject. Ich habe mit der Quelldatei hinzugefügt. Lassen Sie mich innerhalb einer Minute eine Quelle hinzufügen. – Manoj

+0

Es scheint, dass Sie einen globalen (statischen) Kontext verwenden. Das ist nicht zu empfehlen. Außerdem ist diese Erweiterungsmethode nicht sinnvoll. Was auch immer es tut, es * nie * speichert nur das 'EntityObject'. Es speichert * jede * angehängte Entität, die nicht "Unverändert" ist. Außerdem verstehe ich nicht, warum Sie ein 'DbSet' eingeben und dann erwarten, dass eine Erweiterungsmethode für' EntityObject' ausgeführt wird. –

Antwort

1

Also, wenn ich versuche, irgendeine Entität mit dieser Hilfsmethode zu speichern, findet sie nie heraus.

Es wird nicht, weil Galerie nur eine Klasse ist und nicht von EntityObject vererbt wird.

Ich schlage nicht das Hinzufügen von Erbschaft oder Modifizierung von automatisch generierten Klassen.

Verwenden Macht der Teilklassen:

Sie können patial jeweiligen Kategorie für Ihre Modelle mit Schnittstelle erstellen.

public partial class Gallery : IEntity 
{ 
    //This is your class different than auto generated class by Ef. 
} 

Auch sollten Sie nicht versuchen, Fang für die Entscheidung zu verwenden. Deshalb sollten Sie update trennen und erstellen und auf oberer Ebene entscheiden (ohne try catch).

So sollten Ihre Erweiterungsmethoden so sein.

public static int Update<T>(this T entity) where T : IEntity 
{ 
    using(var dbContext=new SUContextContainer()) 
    { 
     var entry = dbContext.Entry(entity); 
     dbContext.Set<T>().Attach(entity); 
     entry.State = EntityState.Modified; 
     return dbContext.SaveChanges(); 
    } 
} 

public static int Create<T>(this T entity) where T : IEntity 
{ 
    using(var dbContext=new SUContextContainer()) 
    { 
     dbContext.Set<T>().Add(entity); 
     return dbContext.SaveChanges(); 
    } 
} 
1

Ihre Erweiterungsmethode gilt nur für Typen, die von EntityObject erben. Sie müssen entweder alle Entitätsklassen von dieser EntityObject-Klasse übernehmen oder eine andere Erweiterungsmethode erstellen, die für den richtigen Typ gilt.

Normalerweise, wenn diese Art von Persistenz Mustern würden Sie eine Entität Basisklasse

public class Entity 
{ 
    public int Id { get; set; } 
} 

und jeder Entitätstyp erbt erstellen daraus

public class Gallery : Entity 
{ 
    public int Name { get; set; } 
} 

Dann können Sie gängige Methoden, die Sie über verwenden Entitätstypen:

public static void Save(this Entity entity); 
+0

Sie haben Recht. Ich muss es einstellen und später anpassen. Hast du bitte ein Beispiel für mich? – Manoj