Как удалить связанный объект в Entity Framework, не имея доступа к контексту объекта - PullRequest
1 голос
/ 20 января 2010

Имея две модели, Site и Link, где у сайта много ссылок, как мне удалить ссылку из метода Site, у которого нет доступа к контексту объекта?

Я пробовал что-то вроде:

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

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

Отношение добавляется или удаляется из AssociationSet 'Sites_have_Links'. С ограничениями по количеству элементов соответствующие «ссылки» также должны быть добавлены или удалены.

Как на самом деле удалить ссылку из базы данных?

Ответы [ 4 ]

1 голос
/ 20 января 2010

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

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 голосов
/ 24 сентября 2012
  1. Для работы с сущностями, чтобы изменения были отражены в базе данных, вы ДОЛЖНЫ ДОБАВИТЬ / ПРИЛОЖИТЬ эти сущности в контексте объекта (в терминах 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!
0 голосов
/ 20 января 2010

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

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

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

0 голосов
/ 20 января 2010

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

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