Почему связь с типом моей сущности разрывается?

Поэтому в настоящее время я пытаюсь заполнить базу данных dev тестовой информацией для наших разработчиков, но столкнулся с этой проблемой.
Связь между типами сущностей «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; }

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


person jfiggins    schedule 27.01.2020    source источник


Ответы (1)


Ознакомьтесь с документацией по каскадному удалению.

Для второго действия выше установка значения внешнего ключа в значение null недействительна, если внешний ключ не допускает значение 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; }
}
person Athanasios Kataras    schedule 27.01.2020
comment
AddBy на самом деле является частью интерфейса, который унаследован во многих местах моего кода, есть ли способ обойти это, не изменяя большую часть моего кода? - person jfiggins; 27.01.2020
comment
Это требуется? Это означает, может ли строка Progress существовать без профиля? Если да, nullable - это путь. В противном случае установите отношение каскадного удаления. - person Athanasios Kataras; 27.01.2020