@CityzenUNDEAD

Почему миграция данных происходит, а обновление базы нет из-за нарушения ограничения внешнего ключа?

Всем привет!
Пытаюсь внести изменения в базу данных средствами entity framework.
Версия фреймворка 7.0.3
Есть 2 класса которые связаны с таблицами.

[Table("OrganizationControl")]
public class OrganizationControl : CreationAuditedEntity, IMayHaveTenant, ISoftDelete
{
    public virtual string Name { get; set; }
    
    public virtual string Description { get; set; }
    public virtual int? UserId { get; set; }
    
    public virtual bool IsDeleted { get; set; }

и 2й

[Table("RiskLevels")]
    public class RiskLevel : CreationAuditedEntity, IMayHaveTenant, ISoftDelete
    {
        public int? UserId { get; set; }
        
        public virtual int OrganizationControlId { get; set; }
        
        [ForeignKey("OrganizationControlId")]
        public OrganizationControl OrganizationControlFk { get; set; } 
        public virtual string Description { get; set; }

        public virtual string ExtendDescription { get; set; }
        
        public virtual int ControlTypeId { get; set; }

        [ForeignKey("ControlTypeId")]
        public ControlType ControlTypeFk { get; set; }

        public bool IsDeleted { get; set; }
    }


Так вот, изменения которые я внес это
public virtual int OrganizationControlId { get; set; }
        
        [ForeignKey("OrganizationControlId")]
        public OrganizationControl OrganizationControlFk { get; set; }

То есть, я пытаюсь добавить ссылку на таблицу OrganizationControl из таблицы RiskLevels через добавленное свойство OrganizationControlId.
Миграция создается. Но процедура dotnet ef database update заканчивается ошибкой.

23503: INSERT или UPDATE в таблице "RiskLevels" нарушает ограничение внешнего ключа "FK_RiskLevels_OrganizationControl~"

DETAIL: Ключ (OrganizationControlId)=(0) отсутствует в таблице "OrganizationControl".
Это как понимать?
Ключа OrganizationControlId в таблице OrganizationControl" в принципе быть не должно, там же просто Id есть.
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
У вас в таблице RiskLevels есть запись, где OrganizationControlId равен 0.
1. В EF ключ не может быть равен 0.
2. Значит и в таблице "OrganizationControl " у вас нет записи с ключом 0

Решение.
Добавьте в файл миграции руками до кода создания FK
migrationBuilder.UpdateData(
    table: "RiskLevels ",
    keyColumn: "OrganizationControlId",
    keyValue: 0,
    column: "OrganizationControlId",
    value:  <сюда валидное значение ключа >);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
CityzenUNDEAD, сообщение об ошибке означает, что у вас таки действительно кривые данные, а именно - есть минимум одна запись в RiskLevels со значением поля OrganizationControlId = 0, для которой в таблице OrganizationControl нет записи с таким же значением первичного ключа (как я понял - поля Id).
Вывести все такие записи из RiskLevels, которые ссылаются на отутствующие записи в OrganizationControl, можно SQL-запросом
SELECT * FROM RiskLevels WHERE OrganizationControlId!=ALL(SELECT Id FROM OrganizationControl)

И пока такие записи есть, наложить ограничение внешнего ключа не поле RiskLevels.OrganizationControlId у вас не получится. Ищите и разбирайтесь, что с этими записями делать.

PS Entity Framework - он шибко умный, он сам находит связанные друг с другом поля, сам добавляет поля для чего-нибудь типа первичного ключа и т.д. Так что не удивляйтесь, что EF умничает, а если не хотите этого - жестко его контролируйте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы