Наследование ядра Entity Framework - конфликт ограничения внешнего ключа при вставке - PullRequest
1 голос
/ 05 августа 2020

Я новичок в Entity Framework Core, и у меня есть следующие классы, которые я пытаюсь настроить с помощью Fluent API. EntityType - это поле дискриминатора, а EntityReference должно быть внешним ключом для Mov ie или Book в зависимости от EntityType.

Схема базы данных

public abstract class Review
{
    public Guid ReviewId { get; set; }
    public Guid EntityReference { get; set; }
    public string EntityType { get; set; }
    public string Comments{ get; set; }
}

public MovieReview: Review {}

public BookReview: Review {}

public class Movie
{
    public Guid MovieId { get; set; }
    public string MovieTitle { get; set; }
    ...
    ICollection<MovieReview> Reviews {get; set;}
}

public class Book
{
    public Guid BookId { get; set; }
    public string BookTitle { get; set; }
    ...
    ICollection<BookReview> Reviews {get; set;}
}

Классы конфигурации:

public class ReviewConfiguration : IEntityTypeConfiguration<Review>
{
    public void Configure(EntityTypeBuilder<Review> builder)
    {
        builder.ToTable("Review");
        builder.HasKey(o => o.ReviewId);
        builder.HasDiscriminator<string>(o => o.EntityType)
            .HasValue<Movie>("Movie")
            .HasValue<Book>("Book");
     }
}

public class MovieConfiguration : IEntityTypeConfiguration<Movie>
{
    public void Configure(EntityTypeBuilder<Movie> builder)
    {
        builder.ToTable("Movie");
        builder.HasKey(o => o.MovieId);
        ...
        builder.HasMany(o => o.MovieReviews)
            .WithOne(o => o.Movie)
            .HasForeignKey(v => v.EntityReference);
    }
}

public class BookConfiguration : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        builder.ToTable("Book");
        builder.HasKey(o => o.BookId);
        ...
        builder.HasMany(o => o.BookReviews)
            .WithOne(o => o.Movie)
            .HasForeignKey(v => v.EntityReference);
    }
}

Когда я пытаюсь добавить / обновить рецензию на книгу, я получаю сообщение об ошибке:

Оператор INSERT конфликтует с ограничением FOREIGN KEY «FK_Review_Book_EntityReference». Конфликт произошел в базе данных, таблица «Книга», столбец «BookId».

Я не могу вносить изменения в таблицы базы данных. Есть ли способ использовать свободную конфигурацию api, чтобы гарантировать, что EntityReference будет связываться с MovieId, когда EntityType имеет значение «Mov ie» и игнорировать ограничение FK, FK_Review_Book_EntityReference и аналогично для Book?

1 Ответ

0 голосов
/ 09 августа 2020

попробуйте, пожалуйста, измените определение вашего класса следующим образом:

    public abstract class Review
    {
        public Guid ReviewId { get; set; }
        public string EntityType { get; set; }
        public string Comments { get; set; }
    }

    public class MovieReview: Review
    {
        public Guid MovieId { get; set; }
        public Movie Movie { get; set; }
    }

    public class BookReview: Review
    {
        public Guid BookId { get; set; }
        public Book Book { get; set; }
    }

И свободная конфигурация должна быть такой:

    public class MovieConfiguration : IEntityTypeConfiguration<Movie>
    {
        public void Configure(EntityTypeBuilder<Movie> builder)
        {
            builder.ToTable("Movie");
            builder.HasKey(o => o.MovieId);
            ...
            builder.HasMany(o => o.MovieReviews)
                .WithOne(o => o.Movie)
                .HasForeignKey(v => v.MovieId);
        }
    }

    public class BookConfiguration : IEntityTypeConfiguration<Book>
    {
        public void Configure(EntityTypeBuilder<Book> builder)
        {
            builder.ToTable("Book");
            builder.HasKey(o => o.BookId);
            ...
            builder.HasMany(o => o.BookReviews)
                .WithOne(o => o.Book)
                .HasForeignKey(v => v.BookId);
        }
    }
...