LINQ to SQL и присоединение дочерних объектов - PullRequest
4 голосов
/ 17 июня 2009

Я пишу класс, который (надеюсь) позволит манипулировать данными через слой LINQ to SQL без необходимости знать, с какими отдельными объектами вы работаете. Пока что он отлично работает для каскадного выбора и вставки, но у меня проблемы с обновлениями.

Вот метод сохранения, который я использую:

if ((long)entity.GetType().GetProperty(GetPrimaryKeyName(entity)).GetValue(entity, null) == 0)
            {
                Context.GetTable(entity.GetType()).InsertOnSubmit(entity);
            }
            else
            {
                Context.GetTable(entity.GetType()).Attach(entity, true);
            }

            foreach (PropertyInfo property in entity.GetType().GetProperties())
            {
                if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(EntitySet<>))
                {
                    IEnumerable children = (IEnumerable)property.GetValue(entity, null);
                    foreach (object child in children)
                    {
                        Save(child);
                    }
                }
            }

Это работает, пока у меня не появится дочерний объект как часть обновления. Например, если я передаю объект Customer с дочерним объектом Address, который необходимо обновить и не вставлять, как только я присоединяю объект Customer, у меня теперь есть два объекта Address в моем EntitySet - объект, извлеченный из базы данных и новый. Затем я получаю исключение «Не удается присоединить сущность, которая уже существует», когда он пытается присоединить первый дочерний объект Address.

Есть идеи?

1 Ответ

2 голосов
/ 07 июля 2009

Не могли бы вы присоединить дочерние объекты до того, как присоедините родительские объекты? Это предотвратит проблему прикрепления?

Просто используйте отражение, чтобы получить все EntityRef объекты, и прикрепите свойство Entity каждого к соответствующей таблице.

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