EF Core报错:Item实体无法同时配置为自有与非自有类型
EF Core 实体配置冲突解决方案
错误核心是同一个实体Item被同时配置为「拥有型实体」和「独立实体」:
- 你通过
Mahsool的OwnsOne<Item>将Item标记为Mahsool的附属拥有实体(EF Core会将Item的字段嵌入Mahsool表,不会为Item单独建表) - 又通过
modelBuilder.Entity<Item>试图将Item配置为独立实体,还额外添加了一对一关联,两种配置完全冲突,导致报错。
以下是两种对应场景的解决方案:
场景1:将Item作为Mahsool的拥有实体(不单独建表)
删除所有针对Item的独立配置和一对一关联,把Item的属性配置嵌套在OwnsOne的builder中:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<DToM>().HasKey(t => new { t.DasteBandiId, t.MahsoolId }); modelBuilder.Entity<Mahsool>(p => { p.HasKey(w => w.id); // 在OwnsOne的嵌套builder中配置Item的属性和约束 p.OwnsOne(w => w.Item, itemBuilder => { itemBuilder.Property(w => w.price).HasColumnType("تومان"); itemBuilder.HasKey(w => w.id); // 可选,根据业务需求决定是否为拥有实体定义键 }); }); }
这种方式下,EF Core不会为Item创建单独的表,而是将Item的字段(如Item_price、Item_id)合并到Mahsool表中。
场景2:将Item作为独立实体,与Mahsool建立一对一关联
删除OwnsOne配置,保留一对一关联,并单独配置Item:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<DToM>().HasKey(t => new { t.DasteBandiId, t.MahsoolId }); modelBuilder.Entity<Mahsool>(p => { p.HasKey(w => w.id); // 配置Mahsool与Item的一对一关联 p.HasOne(w => w.Item) .WithOne(w => w.mahsool) .HasForeignKey<Item>(w => w.id); // 注意:此处外键使用Item的id,需确保业务逻辑合理 }); // 单独配置Item实体 modelBuilder.Entity<Item>(i => { i.Property(w => w.price).HasColumnType("تومان"); i.HasKey(w => w.id); }); }
这种方式下,EF Core会为Item创建独立的数据库表,并建立与Mahsool的一对一外键关系。
内容的提问来源于stack exchange,提问作者AliHANiF
相关产品推荐
相关产品推荐

