C# 实体框架核心继承-插入时外键约束冲突
我是EntityFrameworkCore的新手,我尝试使用FluentAPI配置以下类。EntityType是一个鉴别器字段,EntityReference应该是电影或书籍的外键,具体取决于EntityTypeC# 实体框架核心继承-插入时外键约束冲突,c#,sql-server,inheritance,entity-framework-core,ef-code-first,C#,Sql Server,Inheritance,Entity Framework Core,Ef Code First,我是EntityFrameworkCore的新手,我尝试使用FluentAPI配置以下类。EntityType是一个鉴别器字段,EntityReference应该是电影或书籍的外键,具体取决于EntityType 公共抽象类评论 { 公共Guid ReviewId{get;set;} 公共Guid EntityReference{get;set;} 公共字符串EntityType{get;set;} 公共字符串注释{get;set;} } 公共电影评论:评论{} 公共图书评论:评论{} 公映
公共抽象类评论
{
公共Guid ReviewId{get;set;}
公共Guid EntityReference{get;set;}
公共字符串EntityType{get;set;}
公共字符串注释{get;set;}
}
公共电影评论:评论{}
公共图书评论:评论{}
公映
{
公共Guid电影ID{get;set;}
公共字符串MovieTitle{get;set;}
...
ICollection Reviews{get;set;}
}
公共课堂用书
{
公共Guid BookId{get;set;}
公共字符串BookTitle{get;set;}
...
ICollection 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);
}
}
公共类审阅配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建造商。可转让(“审查”);
builder.HasKey(o=>o.ReviewId);
builder.HasDiscriminator(o=>o.EntityType)
.HasValue(“电影”)
.HasValue(“账簿”);
}
}
公共类电影配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商。ToTable(“电影”);
builder.HasKey(o=>o.MovieId);
...
builder.HasMany(o=>o.MovieReviews)
.WithOne(o=>o.Movie)
.HasForeignKey(v=>v.EntityReference);
}
}
公共类BookConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商。可折叠(“账簿”);
builder.HasKey(o=>o.BookId);
...
builder.HasMany(o=>o.bookriews)
.WithOne(o=>o.Movie)
.HasForeignKey(v=>v.EntityReference);
}
}
当我尝试添加/更新书评时,出现以下错误:
INSERT语句与外键约束冲突
“FK_书评实体参考”。数据库、表中发生冲突
“Book”,列“BookId”
我无法对数据库表进行任何更改。是否有一些方法可以使用fluent api配置来确保EntityType为“Movie”时EntityReference将链接到MovieId,并忽略FK约束、FK\u Review\u Book\u EntityReference以及Book的类似设置?请尝试如下更改您的类定义:
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);
}
}
流畅的配置必须如下所示:
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);
}
}
公共类电影配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商。ToTable(“电影”);
builder.HasKey(o=>o.MovieId);
...
builder.HasMany(o=>o.MovieReviews)
.WithOne(o=>o.Movie)
.HasForeignKey(v=>v.MovieId);
}
}
公共类BookConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商。可折叠(“账簿”);
builder.HasKey(o=>o.BookId);
...
builder.HasMany(o=>o.bookriews)
.WithOne(o=>o.Book)
.HasForeignKey(v=>v.BookId);
}
}
请尝试更改您的类定义,如下所示:
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);
}
}
流畅的配置必须如下所示:
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);
}
}
公共类电影配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商。ToTable(“电影”);
builder.HasKey(o=>o.MovieId);
...
builder.HasMany(o=>o.MovieReviews)
.WithOne(o=>o.Movie)
.HasForeignKey(v=>v.MovieId);
}
}
公共类BookConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商。可折叠(“账簿”);
builder.HasKey(o=>o.BookId);
...
builder.HasMany(o=>o.bookriews)
.WithOne(o=>o.Book)
.HasForeignKey(v=>v.BookId);
}
}