EFCore Map 2实体到同一表-无法添加新条目

时间:2019-12-17 00:08:17

标签: .net-core entity-framework-core ef-core-2.2

我有两个单独的集合,例如“集团”和“品牌”,这两者之间存在多对多关系。由于这是两个单独的聚合,因此我分别创建了单独的桥接实体BrandGroupGroupBrand。现在,我想将这两个映射到同一张表。两个实体都在相同的DbContext 下。以下是我的实体配置:

public class BrandGroupEntityTypeConfiguration : BaseEntityTypeConfiguration<BrandGroup>
{
    public override void Configure(EntityTypeBuilder<BrandGroup> brandGroupConfiguration)
    {
        base.Configure(brandGroupConfiguration);
        brandGroupConfiguration.ToTable("BrandGroup");
        brandGroupConfiguration.Property(bc => bc.GroupId).IsRequired().HasColumnName(nameof(BrandGroup.GroupId));
        brandGroupConfiguration.Property(bc => bc.BrandId).IsRequired().HasColumnName(nameof(BrandGroup.BrandId));
        brandGroupConfiguration.HasIndex(bc => new { bc.GroupId, bc.BrandId }).IsUnique().HasFilter("[Deleted] = 0");
        brandGroupConfiguration.HasOne<GroupBrand>().WithOne().HasForeignKey<BrandGroup>(b => b.Id);
    }
}


public class GroupBrandEntityTypeConfiguration : BaseEntityTypeConfiguration<GroupBrand>
{
    public override void Configure(EntityTypeBuilder<GroupBrand> groupBrandConfiguration)
    {
        base.Configure(groupBrandConfiguration);
        groupBrandConfiguration.ToTable("BrandGroup");
        groupBrandConfiguration.Property(gb => gb.GroupId).IsRequired().HasColumnName(nameof(GroupBrand.GroupId));
        groupBrandConfiguration.Property(gb => gb.BrandId).IsRequired().HasColumnName(nameof(GroupBrand.BrandId));
    }
}

但是,当我尝试添加没有相应品牌组的新品牌或组时,这样做可以节省很多。但是,如果我尝试通过“品牌”或“组”添加品牌组关系,则会返回错误:

  

类型'GroupBrand'的实体与类型'BrandGroup'的实体共享表'Configuration.BrandGroup',但是没有具有相同键值且被标记为'Added'的该类型的实体。 / p>

我不太确定自己缺少什么。

1 个答案:

答案 0 :(得分:1)

实体框架抱怨状态无效。

基本上,它会看到已添加BrandGroup,但是GroupBrand中没有相同的实体。但是它们是同一张桌子。

那么根据Entity Framework,是否添加了某些内容?如果查看BrandGroup,则可能得出结论:已添加了某些内容,但是如果查看了GroupBrand,则未添加任何内容。因此存在冲突。

通常在多对多关系中,您会遇到类似的情况

       ╔════════════╗
Group ═╣ GroupBrand ╠═ Brand
       ╚════════════╝

因此,Brand对象和Group对象都将具有GroupBrand对象的集合。

因此,我只有一个或另一个,而不是拥有GroupBrand和BrandGroup。