Сохранить связь между двумя объектами в NN-ассоциации - PullRequest
5 голосов
/ 17 февраля 2011

У меня есть Entity Framework 4.0 с объектом poco.файл модели edmx генерируется из базы данных.

Доступ к этому текстовому тексту осуществляется через службу WCF, это только означает, что я получаю некоторые объекты и мне нужно присоединить их к текущему текстовому данным (или перезагрузить их с соответствием ключа).

Кажется, что все работает нормально, за исключением одного случая:

У меня есть NN-связь между двумя таблицами, поэтому у меня есть таблица ассоциации, без каких-либо полей, кроме IDдве таблицы: Database model

LINQ преобразуйте это в следующую схему, это кажется правильным.LINQ Data model

Когда я получаю данные, проблем нет, данные, которые я сам вставил в Right_group, корректно преобразуются в «новый объект в моей коллекции прав / групп».

Но если я попытаюсь что-то изменить и сохранить, это не сработает

 public void SaveRights(Group group, List<Rights> rights){
     //here, group and rights are objects attached to the database
     group.Rights.Clear();
     group.Rights.AddRange(rights);
     _dataContext.SaveChanges();
 }

Итак, мой вопрос: как сохранить эти «отношения» двух объектов?Спасибо!

Ответы [ 2 ]

8 голосов
/ 17 февраля 2011

Если вы хотите сначала избежать загрузки объектов из базы данных, вы можете сделать это следующим образом (код взят из одного из моих приложений, поэтому вам придется его адаптировать):

    public void AddAndRemovePersons(int id, int[] toAdd, int[] toDelete)
    {
        var mailList = new MailList { ID = id, ContactInformations = new List<ContactInformation>() };        
        this.db.MailLists.Attach(mailList);

        foreach (var item in toAdd)
        {
            var ci = new ContactInformation { ID = item };
            this.db.ContactInformations.Attach(ci);
            this.db.ObjectStateManager.ChangeRelationshipState(mailList, ci, ml => ml.ContactInformations, System.Data.EntityState.Added);
        }

        foreach (var item in toDelete)
        {

            var ci = new ContactInformation { ID = item };
            this.db.ContactInformations.Attach(ci);
            this.db.ObjectStateManager.ChangeRelationshipState(mailList, ci, ml => ml.ContactInformations, System.Data.EntityState.Deleted);
        }
    }

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

Если вы добавляете новые объекты, которые также хотите сохранить, вы должны использовать

this.db.MailLists.AddObject(you new item here)

Надеюсь, это поможет!

0 голосов
/ 17 февраля 2011

Просто мысль ... как настроены клавиши в таблице Right_Group? Если вы используете оба ключа IDRight и IDGroup в качестве первичного ключа - эта проблема может возникнуть. Одним из предложений является добавление нового столбца (ID) в таблицу Right_Group и наличие этого ID в качестве первичного ключа. Затем используйте внешние ключи для других столбцов (IDRight, IDGroup) соответственно.

...