2010-01-19 5 views
1

Имея две модели, сайт и ссылку, где сайт имеет много ссылок, как удалить ссылку из метода сайта, t иметь доступ к контексту объекта?Как удалить связанный объект в Entity Framework без доступа к контексту объекта

Я пытался что-то вроде:

public void DeleteFirstLink() { 
    var link = LinkSet.First(); 
    LinkSet.Remove(link); 
} 

но мне кажется, что на самом деле не удалить ссылку, но разорвать связь. Поскольку существует ограничение базы данных, она вызывает эту ошибку:

A relationship is being added or deleted from an AssociationSet 'Sites_have_Links'. With cardinality constraints, a corresponding 'Links' must also be added or deleted.

Как я действительно удаляю ссылку из базы данных?

ответ

0

Вы не можете удалить что-либо из базы данных без контекста объекта. Все действия помещаются в очередь в диспетчере состояний контекста объекта, и они сохраняются в базе данных при вызове ObjectContext.SaveChanges(). Без SaveChanges никакой DB не изменяется.

+0

Я в порядке с очередями действий, я просто хочу, чтобы их можно было поставить в очередь изнутри метода в сущности. – Pablo

0

Прежде всего, было бы здорово, если бы вы могли разместить дополнительную информацию о своих структурах классов. У класса сайта есть объект ObjectContext? Затем в качестве быстрого решения вы можете передать его методу удаления и использовать метод context.DeleteObject() и впоследствии вызвать SaveChanges.

Однако, как долговременное решение, я по-прежнему рекомендую использовать шаблон UnitOfWork, и я отправлю ссылку на сообщение article, объяснив его снова. Реализация может быть иной, но в целом она может решить большинство ваших проблем (аналогично этому).

Красота этого подхода заключается в том, что, если вы используете его правильно, вы можете создать небольшую структуру, которую впоследствии можно будет использовать во всех ваших проектах EF.

+0

Нет, объект сайта не имеет ObjectContext, почему он должен? – Pablo

+0

Ну, как вы теперь управляете ObjectContext? Являются ли объекты сайта и ссылки, созданные EF? Наследуют ли они EntityObject или вы используете классы POCO? Расширяете ли вы сайт с помощью частичного класса в отдельном файле? – Yakimych

+0

Да, сайт и ссылка - это объекты, созданные EF. Я предполагаю, что они наследуют EntityObject, но я должен был бы проверить. У меня есть частичные классы в отдельных файлах для сайта и, возможно, Link (извините, не перед кодом прямо сейчас), но если нет, я могу их сделать. – Pablo

1

Предполагая, что ваш ObjectContext не жив, когда вызывается метод DeleteFirstLink(), вы можете заставить его работать путем раскручивания контекста внутри метода, приложив сущность сайта, а затем удалить ссылку:

public void DeleteFirstLink() 
{ 
    using (ProjectEntities db = new ProjectEntities()) 
    { 
    db.AttachTo("[your site EntitySet name - SiteSet?]", this); 
    var link = LinkSet.First(); 
    db.DeleteObject(link); 
    LinkSet.Remove(link); 
    db.SaveChanges(); 
    } 
} 
+0

Мне действительно интересно, это работает? И я не имею в виду, что он работал один раз, я имею в виду, что он работает хорошо и не будет взорваться на крайних случаях. – Pablo

+0

Я не вижу причин, почему это не сработает. Для удаления объекта требуется объект ObjectContext, поэтому вы закручиваете его, присоединяете объект и затем вызываете метод DeleteObject. Что вы подразумеваете под «краевыми случаями», кстати? – Yakimych

0
  1. для работы с юридическими лицами, так что изменения отражаются в базе данных вы должны добавить /ATTACH этих объектов в контексте объекта (с точкой зрения EF5 в контексте базы данных), а затем использовать метод SaveChanges для фиксации изменений.

  2. Да, в EF4, чтобы удалить запись из ФИЗИЧЕСКОЙ SQL таблицы (не ссылку), необходимо использовать метод DeleteObject объекта ObjectContext, а затем SaveChanges, т.е.

    using(ObjectContext context = new ObjectContext) 
    { 
        /* Find the removed record in object/database context (this will attaches 
        * the record to object/database context) 
        * It is recommened to use FirstOrDefault() instead of First() 
        * becase this method can return null if there is no record to delete 
        * instead generation of exception in case of using First() 
        */ 
        Link linkToDelete = context.Links.FirstOrDefault(); 
        if(linkToDelete != null) 
        { 
         context.DeleteObject(linkToDelete); 
         context.SaveChanges(); 
        } 
    } 
    
  3. К счастью, теперь есть EF5, который позволяет удалить из родительской коллекции, но только если отношение равно один ко многим.

    using(DatabaseContext context = new DatabaseContext) 
    { 
        Link linkToDelete = context.Links.FirstOrDefault(); 
        if(linkToDelete != null) 
        { 
         context.Links.Remove(linkToDelete); 
         context.SaveChanges(); 
        } 
    } 
    
  4. В любом случае НЕ забудьте позвонить в SaveChanges!

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

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