Как удалить запись с ограничением внешнего ключа? - PullRequest
9 голосов
/ 17 марта 2012

Запустил новое приложение ASP.NET MVC 3 и получил следующую ошибку:

Невозможно удалить значение первичного ключа, поскольку ссылки на этот ключ все еще существуют.

Как решить эту проблему?

Модели (сначала код EF)

public class Journal
{
    public int JournalId { get; set; }
    public string Name { get; set; }
    public virtual List<JournalEntry> JournalEntries { get; set; }
}
public class JournalEntry
{
    public int JournalEntryId { get; set; }
    public int JournalId { get; set; }
    public string Text { get; set; }
}

Контроллер

//
// POST: /Journal/Delete/5

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{            
    Journal journal = db.Journals.Find(id);
    db.Journals.Remove(journal);
    db.SaveChanges(); // **exception occurs here**
    return RedirectToAction("Index");
}

Настройка БД

public class FoodJournalEntities : DbContext
{
    public DbSet<Journal> Journals { get; set; }
    public DbSet<JournalEntry> JournalEntries { get; set; }
}

Ответы [ 3 ]

18 голосов
/ 17 марта 2012

Нашли решение:

public class FoodJournalEntities : DbContext
{
    public DbSet<Journal> Journals { get; set; }
    public DbSet<JournalEntry> JournalEntries { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Journal>()
               .HasOptional(j => j.JournalEntries)
               .WithMany()
               .WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);
    }
}

Источник

8 голосов
/ 17 марта 2012

Если вы удаляете запись из таблицы (скажем, «бла»), которая имеет другие отношения с другими таблицами (xyz, abc). По умолчанию база данных не позволит вам удалить строку в «бла», если в одной из других таблиц есть связанные строки.
Решение № 1:
Сначала вы можете вручную удалить связанные строки, для этого может потребоваться много работы.
Решение № 2:
простое решение - настроить базу данных так, чтобы она автоматически удалялась при удалении строки «бла».

После этого откройте диаграмму базы данных и щелкните свойства отношения

enter image description here

В окне "Свойства" разверните ВСТАВИТЬ и ОБНОВЛЕНИЕ Спецификация и установите для свойства DeleteRule значение Каскад.
enter image description here

Сохраните и закройте диаграмму. Если вас спросят, хотите ли вы обновить базу данных, нажмите Да.

Чтобы убедиться, что модель синхронизирует объекты, находящиеся в памяти, с тем, что делает база данных, вы должны установить соответствующие правила в модели данных. Откройте SchoolModel.edmx, щелкните правой кнопкой мыши линию связи между «blah» и «xyz» и выберите «Свойства».

В окне «Свойства» разверните INSERT и UPDATE Спецификацию и установите для свойства DeleteRule значение Cascade.

Решение и изображения, полученные с http://www.asp.net/web-forms/tutorials/getting-started-with-ef/the-entity-framework-and-aspnet-getting-started-part-2

0 голосов
/ 31 декабря 2016

Я нашел это ...

Перейти к SQL Server

Сделайте свою базу данных схематичной

Щелкните правой кнопкой мыши по линии связи между родителем и потомком и откройте свойство этого.

Установите INSERT и Update Specification и просто установите DELETE RULE TO CASCADE.

Помните, что в Project для этой цели не требуется никакого кода, просто отладьте и наслаждайтесь им.

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