【问题标题】:Entity framework core inheritance - foreign key constraint conflict upon insert实体框架核心继承 - 插入时的外键约束冲突
【发布时间】:2020-11-25 06:07:51
【问题描述】:

我是 Entity Framework Core 的新手,我尝试使用 Fluent API 配置以下类。 EntityType 是一个鉴别器字段,EntityReference 应该是 Movie 或 Book 的外键,具体取决于 EntityType。

Database Diagram

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 将在 EntityType 为“Movie”时链接到 MovieId 并忽略 FK 约束 FK_Review_Book_EntityReference 和 Book 一样?

【问题讨论】:

    标签: c# sql-server inheritance entity-framework-core ef-code-first


    【解决方案1】:

    请尝试像这样更改您的类定义:

        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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多