2016-11-17 4 views
0

Ich habe ein Modell namens User (abgeleitet von meiner Datenbank) und ich füge Methoden innerhalb der partiellen Klasse hinzu, was es dem Benutzerobjekt erlaubt, Wartungsarbeiten durchzuführen.Wie kann ich EntityFramework Model in sich selbst speichern?

Als Beispiel möchte ich meine Anwendung wie des Benutzers SupervisorID in seiner Datenbank in Ausrichtung mit einer anderen Datenbank zu aktualisieren:

public partial class User 
{ 
    DatabaseEntities db = new DatabaseEntities(); 
    OtherEntities otherDB = new CommonEntities(); 

     public void UpdateSupervisor() 
     { 
      // Lookup the Supervisor's Username in the other Database: 
      string supervisorUsername = (from x in otherDB.vwEmployees 
           join y in otherDB.vwEmployees on x.Supervisor_EID equals y.Employee_ID 
           where x.User_ID == searchUsername 
           select y.User_ID).FirstOrDefault(); 

      // Update the database to record the Supervisor of this staff member: 
      this.SupervisorUserID = (from x in db.Users 
            where x.ADUsername == supervisorUsername 
            select x.UserID).FirstOrDefault(); 

      // At this point, this.SupervisorUserID stores the correct int, but the following command doesn't save any changes. 
      db.SaveChanges(); 
     } 
} 

Der Code funktioniert, mit der Ausnahme, dass die db.SaveChanges() nicht speichern alles (keine Fehler).

Verfahren außerhalb dieser Klasse genannt wird, als Teil der Login-Verarbeitung:

public class Login { 
// Connect to the database: 
DatabaseEntities db = new DatabaseEntities(); 

User currentUser = new User(); 

// Do some stuff... 

// Update the user's supervisor: 
currentUser.UpdateSupervisor(); 
} 

Irgendwelche Ideen?

Danke,

Russell

+0

ist die gleiche Instanz von 'DatabaseEntities' wie' db' verwendet? Andernfalls würde es keine Änderungen feststellen, da 'db' nur verwendet wird, um Daten in dem von Ihnen geposteten Code zu erhalten. Wenn 'this' mit einer anderen Instanz empfangen wird, funktioniert es nicht. –

+0

Aktualisiert die Frage - ich hoffe, es ist klarer. :-) –

Antwort

0

Ihr db-Objekt in Ihrer Klasse ist von dem in Ihrem Programm unterschiedlich, die diese Methode aufrufen. Außerdem ist Ihr Benutzerobjekt möglicherweise nicht in der Datenbank vorhanden. Es ist also nicht so einfach wie das Festlegen der Eigenschaft und dann das Speichern.

Sie müssen das Element mit Ihrem DB-Objekt innerhalb der Klasse ziehen und dann entsprechend aktualisieren oder hinzufügen.

public partial class User 
{ 
    DatabaseEntities db = new DatabaseEntities(); 
    OtherEntities otherDB = new CommonEntities(); 

     public void UpdateSupervisor() 
     { 
      // Lookup the Supervisor's Username in the other Database: 
      string supervisorUsername = (from x in otherDB.vwEmployees 
             join y in otherDB.vwEmployees on x.Supervisor_EID equals y.Employee_ID 
             where x.User_ID == searchUsername 
             select y.User_ID).FirstOrDefault(); 

      // Update the database to record the Supervisor of this staff member 
      this.SupervisorUserID = (from x in db.Users 
            where x.ADUsername == supervisorUsername 
            select x.UserID).FirstOrDefault(); 

      // Find user in DBContext using your primary key... 
      var user = db.Users.Find(this.ID); 
      if (user != null) 
      { 
       // User exists in database, update id 
       user.SupervisorUserID = this.SupervisorUserID; 
      } 
      else 
      { 
       // User does not exist in database 
       db.Users.Add(this); 
      } 
      db.SaveChanges(); 
     } 
} 
+0

Aktualisiert die Frage zu helfen - die Methode ist innerhalb der Benutzerklasse, eine Teilklasse, die mit der Benutzerklasse übereinstimmt, die von EF aus meiner Datenbank erstellt wird. Innerhalb der Klasse erstelle ich keine Benutzerinstanz, weil ich bereits in der Klasse bin - daher die "Dies" -Syntax. Ich hoffe das hilft. –

+0

Sogar noch glaube ich, dass der Kontext innerhalb Ihrer Benutzerklasse sich von dem Kontext unterscheidet, den Sie möglicherweise verwenden, wenn Sie das Objekt in Ihrer anderen Methode erstellen. – BlueMeanie

+0

Vielleicht bin ich nicht klar über den Unterschied zwischen Kontext und Entitäten ... Ich aktualisierte den Code erneut - beide Klassen verwenden DatabaseEntities db = new DatabaseEntities(); um eine Verbindung zur Datenbank herzustellen. Ich habe keinen Code, der das Wort "Kontext" enthält. :-) Danke für die Hilfe. –

0

Falls jemand kommt sonst über diese - ich in der Lage war, einen Benutzer in der Benutzerteil Klasse zu speichern, die von einem Benutzer in den Benutzer zu erstellen:

public partial class User 
{ 
    DatabaseEntities db = new DatabaseEntities(); 
    OtherEntities otherDB = new CommonEntities(); 

     public void UpdateSupervisor() 
     { 
      // Lookup the Supervisor's Username in the other Database: 
      string supervisorUsername = (from x in otherDB.vwEmployees 
           join y in otherDB.vwEmployees on x.Supervisor_EID equals y.Employee_ID 
           where x.User_ID == searchUsername 
           select y.User_ID).FirstOrDefault(); 

      // Update the database to record the Supervisor of this staff member: 
      this.SupervisorUserID = (from x in db.Users 
            where x.ADUsername == supervisorUsername 
            select x.UserID).FirstOrDefault(); 
      // NEW CODE: 
      // Create a new user inside the User class, set to the current User by ID: 
      User tempUser = db.Users.Find(this.UserID); 
      tempUser.SupervisorUserID = this.SupervisorUserID; 
      db.SaveChanges(); 
     } 
} 

ich diese Hoffnung ist hilfreich für jemanden . :-)

Russell

Verwandte Themen