EF много ко многим безумие - PullRequest
0 голосов
/ 22 марта 2012

У меня есть метод, который обновляет объект ReportRecipient в EF. Примитивы работают отлично; головная боль возникает при попытке управлять отношениями M2M с объектами RecipientGroups.

Пожалуйста, посмотрите на этот код:

    public IReportRecipient ModifyRecipientWithGroupAssignments(IEnumerable<Guid> groupIds, IReportRecipient recipient)
    {
        var entity = Context.ReportRecipients
            .Include("RecipientGroups")
            .FirstOrDefault(e => e.ReportRecipientId == recipient.ReportRecipientId)
            .FromIReportRecipient(recipient);

        var toRemove = entity.RecipientGroups
            .Where(e => !groupIds.Contains(e.GroupId))
            .ToList();

        //remove group assignments that no longer apply
        foreach (var group in toRemove)
        {
            if (group != null)
            {
                entity.RecipientGroups.Attach(group);
                entity.RecipientGroups.Remove(group);
            }
        }

        var toAdd = entity.RecipientGroups
            .Where(e => groupIds.Contains(e.GroupId))
            .ToList();

        //add new groups that weren't there before
        foreach (var group in toAdd)
        {
            if (group != null)
            {
                entity.RecipientGroups.Attach(group);
            }
        }

        return entity;
    }

... моя проблема в линии var ToAdd.... Даже если у меня есть коллекция Guids в groupIds, которая соответствует Guids, представляющим RecipientGroup объекты в базе данных, toAdd всегда будет пустой коллекцией. Я думаю, что функция Contains() подойдет для этого сценария; Может кто-нибудь объяснить, если я делаю что-то не так?

1 Ответ

1 голос
/ 22 марта 2012

Вы должны загрузить RecipientGroup s, которые вы хотите добавить, из базы данных (Context.RecipientGroups я полагаю), а не из коллекции, в которую вы хотите добавить их (entity.RecipientGroups в примере кода).

...