2009-06-17 7 views
4

Я пишу класс, который (надеюсь) позволит манипулировать данными через слой LINQ to SQL, не зная, с какими индивидуальными объектами вы работаете. Пока что он отлично подходит для каскадных выборок и вставок, но мне сложно с обновлениями.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, теперь у меня есть объекты TWO Address в моем EntitySet - тот, который вытащил из базы данных, и новый. Затем я получаю исключение «Не могу присоединить сущность, которая уже существует», когда он пытается присоединить первый дочерний объект Address.

Любые идеи?

ответ

2

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

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

+0

Я закончил тем, что сделал именно это, и вы правы. Прикрепление от «снизу вверх» решило проблему. – 2009-07-21 19:42:14

Смежные вопросы