Почему моя ассоциация типа сущности разрывается? - PullRequest
1 голос
/ 27 января 2020

Таким образом, в настоящее время я пытаюсь заполнить базу данных разработчиков информацией о тестировании для наших разработчиков, но я сталкиваюсь с этой проблемой -
Связь между типами сущностей 'UserProfile' и 'ProjectProgress' была разорвана, но отношение помечается как «Обязательное» или является неявным образом обязательным, поскольку внешний ключ не имеет значения NULL. Если зависимый / дочерний объект должен быть удален при разрыве требуемой взаимосвязи, то настройте взаимосвязь для использования каскадного удаления. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging для просмотра значений ключа.

Модель профиля пользователя -

        public int UserProfileId { get; set; }
        public UserProfileStatus UserProfileStatusId { get; set; } = UserProfileStatus.Active;
        public SiteRole SiteRoleId { get; set; }
        [MaxLength(100)]
        public string Username { get; set; }
        [MaxLength(50)]
        public string Password { get; set; }
        [MaxLength(100)]
        public string FirstName { get; set; }
        [MaxLength(100)]
        public string LastName { get; set; }
        [MaxLength(20)]
        public string Phone { get; set; }
        [MaxLength(150)]
        public string Email { get; set; }
        public DateTime PasswordChangeDt { get; set; } = DateTime.UtcNow;
        public DateTime? LastLoginDt { get; set; }
        public int InvalidLogins { get; set; }
        public bool Locked { get; set; }
        public DateTime? LockoutEnd { get; set; } //local copy of auth db value
        public bool Analyst { get; set; }
        public bool Reviewer { get; set; }
        public bool Broker { get; set; }
        public bool EmailGlobalStatusAlerts { get; set; }
        public bool EmailReviewerStatusAlerts { get; set; }
        public bool EmailAssignedStatusAlerts { get; set; }
        public bool Active { get; set; }
        public int? BankId { get; set; }

        public int AddBy { get; set; }
        public DateTime AddDt { get; set; } = DateTime.UtcNow;
        public int ModBy { get; set; }
        public DateTime ModDt { get; set; } = DateTime.UtcNow;

        public virtual Bank Bank { get; set; }

        [InverseProperty(nameof(ReviewerAnalyst.Analyst))]
        public virtual ICollection<ReviewerAnalyst> AnalystReviewers { get; set; } = new 
        List<ReviewerAnalyst>();
        [InverseProperty(nameof(DocumentAccessLog.AccessUser))] 
        public virtual ICollection<DocumentAccessLog> DocumentAccessLogs { get; set; } = new 
        List<DocumentAccessLog>();
        public virtual ICollection<EmailLog> EmailLogs { get; set; } = new List<EmailLog>();
        public virtual ICollection<Note> Notes { get; set; } = new List<Note>();
        [InverseProperty(nameof(Project.Analyst))]
        public virtual ICollection<Project> ProjectAnalyst { get; set; } = new List<Project>();
        [InverseProperty(nameof(Project.Reviewer))]
        public virtual ICollection<Project> ProjectReviewer { get; set; } = new List<Project>();
        [InverseProperty(nameof(ReviewerAnalyst.Reviewer))]
        public virtual ICollection<ReviewerAnalyst> ReviewerAnalysts { get; set; } = new 
        List<ReviewerAnalyst>();
        public virtual ICollection<TimeOff> TimeOffs { get; set; } = new List<TimeOff>();
        [InverseProperty(nameof(TimeOff.Approver))]
        public virtual ICollection<TimeOff> TimeOffApprovals { get; set; } = new List<TimeOff>();
        public virtual ICollection<UserEmailType> UserEmailTypes { get; set; } = new 
        List<UserEmailType>();
        public virtual ICollection<UserRole> UserRoles { get; set; } = new List<UserRole>();

Модель ProjectProgress -

    public int ProjectProgressId { get; set; }
    public int ProjectId { get; set; }
    public int ProgressId { get; set; }
    [MaxLength(250)]
    public string Notes { get; set; }
    public bool Complete { get; set; }
    public int AddBy { get; set; }
    public System.DateTime AddDt { get; set; }

    public virtual Project Project { get; set; }
    public virtual Progress Progress { get; set; }
    [ForeignKey("AddBy")]
    public virtual UserProfile UserProfile { get; set; }

Я точно не знаю, что нужно для устранения этой проблемы, но дайте мне знать, и я обновлю вопрос.

1 Ответ

1 голос
/ 27 января 2020

Проверьте документацию по Каскадное удаление

Для второго действия, указанного выше, установка значения внешнего ключа в значение NULL недействительна, если внешний ключ не имеет значения NULL. ( Необнуляемый внешний ключ эквивалентен обязательной взаимосвязи. ) В этих случаях EF Core отслеживает, что свойство внешнего ключа было помечено как нулевое, до вызова SaveChanges, в это время выдается исключение потому что изменение не может быть сохранено в базе данных. Это похоже на получение нарушения ограничения из базы данных.

Попробуйте изменить ProjectProgress следующим образом, сделав AddBy обнуляемым следующим образом:

public calss ProjectProgress {
    public int ProjectProgressId { get; set; }
    public int ProjectId { get; set; }
    public int ProgressId { get; set; }
    [MaxLength(250)]
    public string Notes { get; set; }
    public bool Complete { get; set; }
    public int? AddBy { get; set; }
    public System.DateTime AddDt { get; set; }

    public virtual Project Project { get; set; }
    public virtual Progress Progress { get; set; }
    [ForeignKey("AddBy")]
    public virtual UserProfile UserProfile { get; set; }
}
...