7

次のエラー メッセージが表示されますが、エラー メッセージが表示される理由がわかりません。興味深いことに、移行を追加するときにエラーは発生しませんでしたが、コンテキストを使用したいときはいつでもエラーが発生します。

'Block.JobBlock' と 'JobBlock.Block' の 1 対 1 の関係で、子/依存側を特定できませんでした。関係の子/従属側を識別するには、外部キー プロパティを構成します。これらのナビゲーションが同じ関係の一部であってはならない場合は、逆を指定せずに構成します。

AJobは複数JobBlocks(1 対多) を持つことができます。singleBlockは 1 つのみJobBlock(1 対 1) を持つことができます。したがって、基本的に、 aJobBlockは参照に使用される参照テーブル/エンティティJobであり、そのBlocks. エンティティの主キーJobBlockは 2 つのキーで構成されているため、複合主キーになることに注意してください。

BlockエンティティにはすでにIdJobプロパティが含まれている必要があり、エンティティは完全に却下される可能性があると主張する人もいるかもしれませんJobBlockが、このようにすべきではない理由があるので、そのままにしておきましょう :)

モデル:

public class Job : IEntity
{
    public Job()
    {
        JobBlocks = new HashSet<JobBlock>();
    }

    public Guid Id { get; set; } = Guid.NewGuid();
    public ICollection<JobBlock> JobBlocks { get; set; }
}

public class Block : IEntity
{
    public Guid Id { get; set; } = Guid.NewGuid();
    public JobBlock JobBlock { get; set; }
}


public class JobBlock : IEntity
{
    public Guid IdJob { get; set; }
    public Job Job { get; set; }

    public Guid IdBlock { get; set; }
    public Block Block { get; set; }
}

EF 構成:

public class JobConfiguration : IEntityTypeConfiguration<Job>
{
    public void Configure(EntityTypeBuilder<Job> builder)
    {
        builder.HasKey(p => p.Id);
        builder.Property(p => p.Id) .IsRequired() .ValueGeneratedNever();

        builder.HasMany(e => e.JobBlocks)
            .WithOne(e => e.Job)
            .HasForeignKey(p => p.IdJob);
    }
}

public class BlockConfiguration : IEntityTypeConfiguration<Block>
{
    public void Configure(EntityTypeBuilder<Block> builder)
    {
        builder.HasKey(p => p.Id);
        builder.Property(p => p.Id).IsRequired().ValueGeneratedNever();

        builder.HasOne(e => e.JobBlock)
            .WithOne(e => e.Block)
            .HasForeignKey<JobBlock>(p => new { p.IdJob, p.IdBlock });
    }
}

public class JobBlockConfiguration : IEntityTypeConfiguration<JobBlock>
{
    public void Configure(EntityTypeBuilder<JobBlock> builder)
    {
        builder.HasKey(p => new { p.IdJob, p.IdBlock });
        builder.Property(p => p.IdJob).IsRequired();
        builder.Property(p => p.IdBlock).IsRequired();

        builder.HasOne(e => e.Job)
            .WithMany(e => e.JobBlocks)
            .HasForeignKey(p => p.IdJob);

        builder.HasOne(e => e.Block)
            .WithOne(e => e.JobBlock)
            .HasForeignKey<JobBlock>(p => new { p.IdJob, p.IdBlock });
    }
}
4

1 に答える 1