Я пишу класс, который (надеюсь) позволит манипулировать данными через слой 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.
Есть идеи?