обновление связанных данных в структуре объекта - PullRequest
0 голосов
/ 17 июля 2011

В моем хранилище есть функция обновления, которая обновляет сущность TerminalCertification.Но эта сущность имеет отношение «многие ко многим» к другому классу (GomrokJustification).
Моя функция обновления корректно обновляет сущность, но никак не влияет на связанную сущность.Моя функция обновления приведена ниже:

public void UpdateTerminalCertification(TerminalCertification terminalCertification)
    {
        var lastCertification =
            db.terminalCertifications.Include("TimeInfo").Include("GomrokJustifications").Where(item=>item.TerminalCertificationID==terminalCertification.TerminalCertificationID).ToList();
        if (lastCertification.Count==0)
            throw new TerminalCertificationNotFoundException(terminalCertification);
        terminalCertification.TimeInfo = lastCertification[0].TimeInfo;
        ((IObjectContextAdapter)db).ObjectContext.Detach(lastCertification[0]);
        ((IObjectContextAdapter)db).ObjectContext.AttachTo("terminalCertifications", terminalCertification);
        foreach (var gomrokJustification in terminalCertification.GomrokJustifications)
        {
            ((IObjectContextAdapter)db).ObjectContext.AttachTo("gomrokJustifications", gomrokJustification);
            ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.ChangeObjectState(gomrokJustification, EntityState.Modified);
        }
        ((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.ChangeObjectState(terminalCertification,EntityState.Modified);
    }

, а у моего TerminalCetrification есть список GomrokJustifications, который ранее заполнялся некоторыми объектами.Я хочу, чтобы эти последние лица были заменены новыми.но этого не случилось.у кого-нибудь есть идеи?

1 Ответ

1 голос
/ 17 июля 2011

Вместо этого:

var lastCertification = db.terminalCertifications
                          .Include("TimeInfo")
                          .Include("GomrokJustifications")
                          .Where(item=>item.TerminalCertificationID==terminalCertification.TerminalCertificationID)
                          .ToList();

if (lastCertification.Count==0)
  throw new TerminalCertificationNotFoundException(terminalCertification);

вы можете просто сделать это:

var lastCertification = db.terminalCertifications
                          .Include("TimeInfo")
                          .Include("GomrokJustifications")
                          .Where(item=>item.TerminalCertificationID==terminalCertification.TerminalCertificationID)
                          .FirstOrDefault();
if (lastCertification == null)
    throw new TerminalCertificationNotFoundException(terminalCertification);

Сначала выдается исключение, если в коллекции нет элементов, поэтому если вы нене заботясь об исключении исключения сертификата терминала, вы можете даже удалить это пользовательское исключение.Кажется, ваша логика даже предполагает, что в возвращаемом списке будет только один элемент, так что вы даже можете использовать Single ().Это выражает больше того, чего вы хотите достичь, по сравнению с вызовом tolist и последующим извлечением первого элемента.

  1. После тщательного изучения вашего кода я на самом деле не понимаю, чего вы пытаетесь достичь.У вас есть существующий объект терминальной сертификации, с которого вы начинаете, а затем снова получаете его в этом первом запросе, почему?Затем вы берете timeinfo из концептуально той же сущности (потому что вы сделали get by id) в ту, которую вы получаете в качестве входного параметра.Почему бы не продолжить работу над тем, который был извлечен из базы данных?Затем вы отсоединяете сущность, полученную из базы данных, почему?И продолжить работу с входным терминалом сертификации.Я думаю, что вам нужно немного внимательнее взглянуть на документацию структуры сущностей о состоянии сущности и т. Д. Взгляните на ApplyCurrentValues ​​и отсоединение и присоединение объектов здесь: http://msdn.microsoft.com/en-us/library/bb896271.aspx

Нам понадобятся ещеинформация, чтобы помочь вам вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...