отношения не могут быть изменены, внешние ключи не обнуляются - PullRequest
0 голосов
/ 14 марта 2019

Я запускаю (старое) веб-приложение MVC3 в базе данных MSSQL, сначала использую код EF 6.0 и шаблон репозитория.

система работала в производстве в течение последних 7 лет (EF былобновлено около 1 года назад).

Я столкнулся с очень странным исключением в 1 конкретной области системы.при попытке создать или обновить определенные объекты я сталкиваюсь со следующим исключением:

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

здесьодна из проблемных сущностей:

public class BeaconAppErrorLog

    {

        [Key]
        public int Id { get; set; }
        public int EntityId { get; set; }
        public string RawJson { get; set; }
        public DateTime SavedAt { get; set; }

        public int? EmployeeId { get; set; }    
        [ForeignKey("EmployeeId")]
        public Employee Employee { get; set; }

        public int? ContainerId { get; set; }
        [ForeignKey("ContainerId")]
        public Container Container { get; set; }

        public int? DailyTrackId { get; set; }
        [ForeignKey("DailyTrackId")]
        public DailyTrack DailyTrack { get; set; }

        public int? ClientId { get; set; }
        [ForeignKey("ClientId")]
        public Client Client { get; set; }

        public string Error { get; set; }
    }

вот код для создания и сохранения:

 DataContext.BeaconAppErrorLogs.Add(new BeaconAppErrorLog()

                    {
                        EntityId = 2,
                        SavedAt = DateTime.Now,
                        EmployeeId = activity.EmployeeId,
                        DailyTrackId = activity.DailytrackId,
                        Error = error
                    });


DataContext.SaveChanges();

поля 'EmployeeId' и 'DailyTrackId' являются внешними ключами, они получают допустимые значения (т. е. идентификаторы, которые соответствуют соответствующей сущности и существуют в БД)

практически идентичный код пишется сотни раз по всему приложению и функционирует должным образом (даже для одной и той же сущности).

Понятия не имею, что происходит и почему, и пока все попытки, которые я пытался, не сработали.

Ваша помощь будет высоко оценена!

Спасибо,

Nir

1 Ответ

0 голосов
/ 17 марта 2019

оказывается, что решение было полностью в другом месте как указали @gregH и @ tschmit007, EF отслеживает изменения в сущностях. как только мы начали перемещать команду «DataContext.SaveChanges ()» вверх по цепочке выполнения, мы обнаружили, что изменения, вносимые в одну из сущностей выше, вызывали проблему. реальная проблема заключалась в изменении свойства дочерней коллекции в сущность DailyTrack. модификация состояла в том, чтобы фильтровать данные коллекции (LINQ WHERE Клаус выполнял коллекцию).

спасибо всем за помощь.

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