【发布时间】:2020-11-25 06:07:51
【问题描述】:
我是 Entity Framework Core 的新手,我尝试使用 Fluent API 配置以下类。 EntityType 是一个鉴别器字段,EntityReference 应该是 Movie 或 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 将在 EntityType 为“Movie”时链接到 MovieId 并忽略 FK 约束 FK_Review_Book_EntityReference 和 Book 一样?
【问题讨论】:
标签: c# sql-server inheritance entity-framework-core ef-code-first