2017-02-16 29 views
1

У меня есть модели, подобные этим:Как удалить объект, когда его свойства ссылаются на один объект?

public class Line 
{ 
    public int Id {get; set;} 
    public int FromStopId {get; set;} 
    public int ToStopId {get; set;} 
    public virtual Stop FromStop {get; set;}  
    public virtual Stop ToStop {get; set;}  
} 

public class Stop 
{ 
    public int Id {get; set;} 
    public int OwnerId {get; set;} 
    public virtual Owner Owner {get; set;}  
} 

Lines имеют различные Stops, однако многие Stops могут иметь один и тот же Owner.

я загрузить полный Line объект, используя Include следующим образом:

public virtual IQueryable<T> Get(int id, params Expression<Func<T, object>>[] include) 
{ 
    if (include.Any()) 
    { 
     var set = include.Aggregate<Expression<Func<T, object>>, IQueryable<T>> 
          (dbSet, (current, expression) => current.Include(expression)); 
    } 

    return dbSet.AsNoTracking<T>().Where(x => x.Id == id); 
} 

Использование выше, я могу загрузить Line сущность, его Stops лиц и их Owners, который в данном случае является то же самое.

Теперь, когда я пытаюсь удалить Line сущности я делаю:

dbSet.Attach(entity); 
dbSet.Remove(entity); 

Однако я получаю исключение:

Прикрепления объекта типа «Владелец» не удался из-за другой субъект тот же тип уже имеет такое же значение первичного ключа. Это может произойти при использовании метода «Прикрепить» или установки состояния объекта в «Без изменений» или «Модифицировано», если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод «Добавить» или «Добавленное» состояние объекта для отслеживания графика, а затем, если необходимо, установите состояние не новых объектов «Без изменений» или «Модифицировано».

Я предполагаю, что это вызвано тем, что обе Stops имеют одинаковую Owner. Однако Owner не является тем же объектом, кроме двух объектов, которые создаются независимо для каждого Stop при загрузке Line.

Как удалить объект Line в таком случае?

+0

Проверьте, действительно ли эта [ссылка] (http://stackoverflow.com/questions/30350058/attaching-anity-of-type-x-failed-because-another-entity-of-the-same-type) помогает. Если объект загружен из контекста, не прикрепляйте его. – Sarang

+0

@Sarang Объект отсоединен, потому что я использую 'AsNoTracking()'. –

ответ

0

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

1) создать новый объект
2) установить его свойство Id
3) Прикрепите его
4) Удалите его

Что-то вроде :

var toDelete= new MyEntity{ Id = 123 }; 
context.MyEntities.Attach(toDelete); 
context.MyEntities.Remove(toDelete); 
context.SaveChanges(); 

Удаление записи требуется только идентификатор должен быть установлен, таким образом, вероятно, обойти проблему

+0

Я собирался пропустить EF и использовать 'IDbConnection' и' IDbTransaction' для удаления, но это обходное решение работает так же хорошо. –

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

  • Нет связанных вопросов^_^