Entity Framework Core - первый код - два внешних ключа - одна таблица - PullRequest
1 голос
/ 24 января 2020

Я использую EF Core. Я хочу, чтобы мой базовый класс сохранял ссылку на CreateByUser и LastModifiedByUser. К сожалению, я могу заставить его работать только с одним внешним ключом. Когда я пытаюсь добавить второй внешний ключ, я получаю эту ошибку:

Введение ограничения FOREIGN KEY 'FK_Assignments_Users_LastModifiedByUserId' в таблицу 'Assignments' может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки. Обратите внимание, что я могу использовать «Add-Migration» без каких-либо ошибок, но после запуска «Update-Database» он выдает ошибки.

Ниже приведен соответствующий код проблемы и ошибки.

public abstract class DivBase
{
    [Key]
    public int Id { get; set; }

    [Required]
    public DateTimeOffset DateCreated { get; set; }

    public int CreatedByUserId { get; set; }

    [Required]
    public DateTimeOffset LastDateModified { get; set; }

    public int LastModifiedByUserId { get; set; }

    [ForeignKey("CreatedByUserId")]
    public DivUser CreatedByUser { get; set; }

    [ForeignKey("LastModifiedByUserId")]
    public DivUser LastModifiedByUser { get; set; }
}

public class DivUser
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(256)]
    public string Name { get; set; }

    [Required]
    [MaxLength(256)]
    public string Email { get; set; }
}

public class DivAssignment : DivBase, IDivEvent
{
    public DateTimeOffset StartDate { get; set; }
    public DateTimeOffset EndDate { get; set; }      
}

public interface IDivEvent
{
    [Required]
    public DateTimeOffset StartDate { get; set; }

    [Required]
    public DateTimeOffset EndDate { get; set; }
}

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

1 Ответ

0 голосов
/ 25 января 2020

Очевидно, у вас есть 2 Fk s к той же таблице в той же row, поэтому представьте, что если вы удаляете пользователя, который создал назначение и изменил его, что должно произойти, удалите назначение, что если другие пользователи изменили его это будет нулем в таблицах наследников.

, поэтому

Вам необходимо указать CascadeOnDelete до false, используя FluentApi

В ApplicationContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DivAssignment>()
                .HasRequired(c => c.CreatedByUser)
                .WithMany(u => u.CreatedDivAssignments)
                .HasForeignKey(c => c.CreatedByUserId)
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<DivAssignment>()
                .HasRequired(c => c.LastModifiedByUser)
                .WithMany(u => u.ModifiedDivAssignments)
                .HasForeignKey(c => c.LastModifiedByUserId)
                .WillCascadeOnDelete(false);
        }

Затем add-migration, затем update-database

...