Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心继承-插入时外键约束冲突_C#_Sql Server_Inheritance_Entity Framework Core_Ef Code First - Fatal编程技术网

C# 实体框架核心继承-插入时外键约束冲突

C# 实体框架核心继承-插入时外键约束冲突,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;} } 公共电影评论:评论{} 公共图书评论:评论{} 公映

我是EntityFrameworkCore的新手,我尝试使用FluentAPI配置以下类。EntityType是一个鉴别器字段,EntityReference应该是电影或书籍的外键,具体取决于EntityType

公共抽象类评论
{
公共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);
}
}