我一直收到以下错误消息,但似乎无法理解为什么会出现此错误。有趣的是,当我添加迁移时没有出现任何错误,但每当我想要使用上下文时就会出现这个错误。
“Block.JobBlock”和“JobBlock.Block”之间的一对一关系无法确定子/从属方。 要识别关系的子/从属方,请配置外键属性。 如果这些导航不应成为同一关系的一部分,则在不指定反向关系的情况下进行配置。
一个
有人认为
“Block.JobBlock”和“JobBlock.Block”之间的一对一关系无法确定子/从属方。 要识别关系的子/从属方,请配置外键属性。 如果这些导航不应成为同一关系的一部分,则在不指定反向关系的情况下进行配置。
一个
Job
可以拥有多个JobBlocks
(一对多);单个Block
只能有一个JobBlock
(一对一)。 因此,JobBlock
是用于引用Job
及其Blocks
的引用表/实体。 值得注意的是,JobBlock
中的主键由两个键组成,因此它是一个复合主键。有人认为
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 });
}
}
JobBlockConfiguration
中删除另一个关系配置。 - Ivan Stoev