Pregunta

Pensé que la siguiente tarea sería aparentemente fácil de codificar, pero he pasado mucho tiempo y aún no descubrí la forma correcta de resolverla. Aquí está el escenario

Tengo tres entidades ciudad, localidad y donante. City tiene muchas localidades y cada localidad tiene dos a muchas relaciones con el donante como se da a continuación.

public class City {
    public virtual List<Locality> Localities { get; set; }
}

public class Locality {
    public virtual List<Donor> DonorsInOfficeLocality { get; set; }
    public virtual List<Donor> DonorsInResidenceLocality { get; set; }
}

public class Donor : User {
    public virtual Locality OfficeLocality {get;set;}
    public virtual Locality ResidenceLocality { get; set; }
}

En mi módulo de edición de donantes recibo (ID de donante, ResidenceLocityID y OfficeLocityID). La entidad donante se encuentra en estado separado que va a la capa de presentación. Este código no funciona. Las viejas relaciones permanecen intactas.

public void EditDonor(Donor donor, int residenceLocalityId, int officeLocalityId) {
    Locality residenceLocality = context.Localities.Find(residenceLocalityId);
    donor.ResidenceLocality = residenceLocality;
    Locality officeLocality = context.Localities.Find(officeLocalityId);
    donor.OfficeLocality = officeLocality;
    context.Donors.Attach(donor);
    context.Entry(donor).State = EntityState.Modified;
    context.SaveChanges();
}

Una cosa más que probé es cambiar el estado de residencia y oficiales de oficiales a modificado, pero eso tampoco funcionó. Las viejas relaciones permanecieron intactas. Y en este caso, dado que cambio la localidad como modificada, tengo que cargar también City para evitar la excepción de actualización para la localidad modificada.

Si alguien puede hacerme saber cómo modificar una a muchas relaciones (como anteriormente) para la entidad en estado separado recibido de la capa de presentación.

¿Fue útil?

Solución

Puede mantener tanto la propiedad de navegación como la clave extranjera en su modelo.

public class Locality {
     public int Id{get;set;}
    public virtual List<Donor> DonorsInOfficeLocality { get; set; }
    public virtual List<Donor> DonorsInResidenceLocality { get; set; }
}


public class Donor : User {
    public virtual Locality OfficeLocality {get;set;}
    public int OfficeLocalityId{get;set;}

    public virtual Locality ResidenceLocality { get; set; }
    public int ResidenceLocalityId{get;set;}
}

Si tiene las propiedades de clave extranjera que no necesita encontrar por ID para actualizar las propiedades de navegación,

public void EditDonor(Donor donor, int residenceLocalityId, int officeLocalityId) {
     donner.OfficeLocalityId=officeLocalityId;
     donor.ResidenceLocalityId=residenceLocalityId;
    context.Donors.Attach(donor);
    context.Entry(donor).State = EntityState.Modified;
    context.SaveChanges();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top