2013-03-18 2 views
1

У меня есть эти две сущностиCode First Cascade Delete Не Использование Fluent API

class AUT 
{ 
    public Guid ID { get; set; } 
    public string Name { get; set; } 

    public Engineer Engineer { get; set; } 
} 

class InstallationSetup 
{ 
    public virtual AUT ApplicationUnderTesting { get; set; } 

    public Guid ID { get; set; } 
    // Loads of properties etc 
} 

class Engineer 
{ 
    public Guid ID { get; set; } 
    public string Name { get; set; } 
} 

Используя код первого и некоторые данные аннотации эти объекты создают базу данных. Я использую EF 5. Когда я удаляю приложение, он должен удалять только сам и любой InstallationSetup, на который он ссылается. Он не должен удалять Инженер. Однако, когда я попытаться удалить его, я получаю сообщение об ошибке:

The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.InstallationSetups_dbo.AUTs_ApplicationUnderTesting_ID". The conflict occurred in database "UXLab", table "dbo.InstallationSetups", column 'ApplicationUnderTesting_ID'. The statement has been terminated.

Таким образом, я предполагаю, что, потому что есть еще одна таблица с записью, опирающегося на AUT, чтобы быть там, удалив AUT, вы сможете оставить InstallationSetup с нулевым внешним ключом, таким образом, сломанной строкой.

Я должен иметь возможность (предпочтительно не использовать Fluent API) сообщать сущности, что любая вещь, имеющая ссылку на AUT, также должна быть удалена? Этого я хочу достичь.

ответ

2

вам просто нужно добавить столбец, похожий на ваш сгенерированный столбец внешнего ключа, когда инфраструктура сущности генерирует этот столбец FK, он отключил каскадное удаление.

class AUT 
{ 
    public Guid ID { get; set; } 
    public string Name { get; set; } 

    public Engineer Engineer { get; set; } 
} 

class InstallationSetup 
{ 
    public virtual AUT ApplicationUnderTesting { get; set; } 
    public int ApplicationUnderTestingId {get; set;} <--- Add this. 

    public Guid ID { get; set; } 
// Loads of properties etc 
} 

class Engineer 
{ 
public Guid ID { get; set; } 
public string Name { get; set; } 
} 

Если вы сгенерируете свою базу данных снова, вы увидите, что некоторые вещи изменены. Автоматически созданный столбец AUTs_ApplicationUnderTesting_ID больше не существует, а столбец ApplicationUnderTestingId теперь используется для вашего отношения с внешним ключом.

EF автоматически активирует каскадное удаление.

+0

Что касается добавления объекта в базу данных, должен ли я теперь заполнять новое свойство с помощью относительного идентификатора вместо заполнения свойства AUT, или я должен заполнить их оба? –

+0

Просто заполните его с помощью относительного идентификатора EF, который автоматически преобразует его в требуемый объект. – Overmachine