EF Core如何无需DummyField配置Field.FieldTypeId外键约束?
解决方案
你不需要在Entity类里加那个冗余的DummyField,直接用EF Core的Fluent API就能搞定,核心是利用单向导航关系的配置能力——不需要在关联的另一端(Entity)定义对应的导航属性。
场景1:保留Field中的FieldType导航属性
假设你的实体类结构如下:
public class Entity { public int Id { get; set; } // 对应Field.EntityId的导航(可选) public ICollection<Field> OwnedFields { get; set; } } public class Field { public int Id { get; set; } public int EntityId { get; set; } public Entity OwnedByEntity { get; set; } // 字段类型的外键和导航 public int FieldTypeId { get; set; } public Entity FieldType { get; set; } }
在Field的实体配置类(或OnModelCreating方法中)添加如下配置:
// 配置FieldTypeId的外键关联 builder.HasOne(f => f.FieldType) // 因为Entity那边不需要对应Field的导航,直接用无参的WithMany/WithOne // 如果一个Entity可以被多个Field作为类型,用WithMany();如果是一对一场景,用WithOne() .WithMany() .HasForeignKey(f => f.FieldTypeId) // 根据业务需求设置删除行为,比如禁止删除被引用的字段类型Entity .OnDelete(DeleteBehavior.Restrict);
场景2:连Field中的FieldType导航属性都不想加
如果只需要数据库层面的外键约束,不需要实体间的导航关系,也可以直接配置无导航的外键:
builder.HasOne<Entity>() .WithMany() .HasForeignKey(f => f.FieldTypeId) .OnDelete(DeleteBehavior.Restrict);
为什么之前需要DummyField?
大概率是你错误地用了WithOne()来配置这个关联,但实际上一个Entity应该可以被多个Field作为字段类型引用,属于一对多关系(Entity是“一”,Field是“多”),用WithMany()才是正确的,完全不需要反向导航属性。如果确实是一对一场景(一个Entity只能对应一个Field的类型),用WithOne()无参也能完成配置,不需要额外添加DummyField。
内容的提问来源于stack exchange,提问作者Serge Misnik
相关产品推荐
相关产品推荐

