Изменение отношений один ко многим - сначала код - PullRequest
0 голосов
/ 05 сентября 2011

Я думал, что следующую задачу будет легко закодировать, но я потратил много времени и еще не нашел правильный способ ее решения.Вот сценарий

У меня есть три объекта: город, населенный пункт и донор.В городе много населенных пунктов, и у каждого населенного пункта есть два отношения «один ко многим» с донором, как указано ниже.

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; }
}

В моем модуле редактирования донора я получаю (идентификатор донора, ResidenceLocalityId и officeLocalityId).Объект-донор находится в отдельном состоянии, выходящем из уровня представления.Этот код не работает.Старые отношения остаются нетронутыми.

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();
}

Еще одна вещь, которую я попробовал, - это изменить состояние ResidenceLocality и OfficeLocality на Modified, но это тоже не сработало.Старые отношения остались нетронутыми.И в этом случае, поскольку я изменяю локальность как измененную, мне нужно дополнительно загрузить город, чтобы избежать исключения обновления для модифицированной местности.

Если кто-то может сообщить мне, как изменить отношения «один ко многим» (как указано выше)) для объекта в отдельном состоянии, полученного от уровня представления.

1 Ответ

0 голосов
/ 05 сентября 2011

вы можете сохранить как свойство навигации, так и внешний ключ в вашей модели.

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;}
}

если у вас есть свойства внешнего ключа, которые вам не нужно искать по id для обновления свойств навигации,

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();
}
...