Entity Framework-Satz-navigation-Eigenschaft auf null

Ich habe einen entity framework-database first-Projekt. hier ist eine Extraktion des Modells:

public partial class LedProject
{
    public LedProject()
    {
        this.References = new HashSet<LedProjectReference>();
        this.Results = new HashSet<LedProjectResult>();
        this.History = new HashSet<LedProjectHistory>();
    }

    public string Identifier { get; set; }
    public string Name { get; set; }
    public Nullable<System.DateTime> CompletionDate { get; set; }
    public System.DateTime CreationDate { get; set; }
    public System.Guid ProjectId { get; set; }
    public string Comment { get; set; }

    public virtual User ContactUser { get; set; }
    public virtual User CreationUser { get; set; }
    public virtual Customer Customer { get; set; }
    public virtual LedProjectAccounting Accounting { get; set; }
    public virtual LedProjectState State { get; set; }
    public virtual ICollection<LedProjectReference> References { get; set; }
    public virtual ICollection<LedProjectResult> Results { get; set; }
    public virtual User ResponsibleUser { get; set; }
    public virtual ICollection<LedProjectHistory> History { get; set; }
}
public partial class User
{
    public System.Guid UserId { get; set; }
    public string LoginName { get; set; }
    public System.DateTime CreationDate { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
}

Ich habe ein problem mit der Einstellung der navigation den Punkt ResponsibleUser von der Klasse LedProject. Wenn ich die ResponsibleUser zu einem anderen Benutzer, und danach speichern Sie die änderungen der DBContext, die änderungen werden in der Datenbank gespeichert.

Aber, wenn ich will, löschen Sie den aktuellen ResponsibleUser einer LedProject durch Einstellung der Navigations-Eigenschaft auf null. Die änderungen werden nicht in der Datenbank gespeichert.

LedProject project = db.LedProject.Find(projectId);
project.Name = string.IsNullOrEmpty(name) ? null : name;
...
project.ResponsibleUser = responsibleUser == null ? null : db.User.Find(responsibleUser.UserId);
...
db.SaveChanges();

Gibt es irgendeinen trick für das löschen von Navigations-Eigenschaften?

  • Sind Sie sicher, dass responsibleUser ist eigentlich null, wenn Sie die Einstellung project.ResponsibleUser? Die Erklärung, die ist nicht hier. Tut es klar, die navigation, wenn Sie ersetzen, dass Sie die ganze Zeile mit project.ResponsibleUser = null;?
  • es immer noch nicht die Eigenschaft löschen, wenn ich die Zeile ändern zu Projekt.ResponsibleUser = null; Im debug-Modus sehe ich, dass die Eigenschaft auf null gesetzt, aber es wird nicht gespeichert, indem Sie die Methode SaveChanges()
  • Ist die Datenbank, die Spalte null-Werte zulässt? Ist das mapping für die Spalte ID gesetzt, um null-Werte zulassen? Ich habe in der Regel gesehen deklarierten Eigenschaften wie Nullable<User> wenn der Wert null ist eigentlich ein legitimer Wert für Sie. Aber ich habe nicht viel arbeiten EF Praxis, so dass, wenn das ist es nicht, ich bin aus Ideen heraus.
  • Die Datenbank-Spalte null-Werte zulässt. Es ist schon möglich, speichern einen null-Wert in dieser Eigenschaft, weil ich eine neue LedProject ohne ResponibleUser.
  • Ich bin aus Ideen heraus, dann. Viel Glück.
  • Scheint ein wenig seltsam. Was passiert, wenn Sie project = db.LedProject.Find(projectId); unmittelbar nach dem Aufruf db.SaveChanges();? Ist es immer noch null ist?
  • Wenn ich Anrufe var project2 = db.LedProject.Find(projectId); direkt nach db.SaveChanges(); der neue Wert ist nicht zugewiesen. Also ich gedebuggt die Zeilen im detail. Ich habe herausgefunden, wenn ich einen Haltepunkt nach project.ResponsibleUser = responsibleUser == null ? null : db.User.Find(responsibleUser.UserId); den neuen Wert nicht zugewiesen ist. Wenn ich einen breakpoint vor die Zeile und Schritt über das assigment (F10), der Wert ist gesetzt. Dieses Verhalten ist wiederholbar! Sehr seltsames Verhalten
  • Endlich habe ich es gelöst! Es scheint ein problem waren mit lazy loading der Navigationselemente. Wenn ich das erste laden zu LedProject project = db.LedProject.Include("ResponsibleUser").Where(p => p.ProjectId == projectId).FirstOrDefault(); es funktioniert wie vorgesehen!
  • So in diesem Fall project.ResponsibleUser null war aufgrund der fehlenden enthalten. Zu raten, würde ich sagen, dass die Einstellung dieser Eigenschaft auf null, wenn es (irgendwie) schon meinte, war, dass EF angenommen, nichts hatte sich verändert, daher verändern Sie war nicht beibehalten.
  • Es scheint, dass die Eigenschaft geladen wurde, wenn ich versuchte, Sie zu ordnen null. Da wurde die Eigenschaft nicht überschrieben, wenn die assigment war einmal aufgerufen. Als ich es ein zweites mal direkt nach der (in der Uhr - Fenster) die Zuweisung richtig gemacht wurde
  • Schön finden! Sie soll die Frage beantwortet sich selbst, und dann zu akzeptieren. So sonst noch jemanden, der ein ähnliches problem kann möglicherweise finden Sie die Antwort.
  • Das war mein plan, aber es ist ein 8h selbst beantworten zu sperren, so werde ich es jetzt tun

InformationsquelleAutor boindiil | 2012-10-10
Schreibe einen Kommentar