EF Core通用翻译表关系配置求助(Fluent API)
通用翻译架构的EF Core Fluent API关系配置方案
1. 实体类定义
首先定义通用的Translations实体,它不依赖任何业务实体,仅存储翻译核心数据:
public class Translation { public int Id { get; set; } public string LanguageCode { get; set; } // 示例值:"zh-CN"、"en-US" public string Content { get; set; } // 可按需添加通用字段,如创建时间、创建人ID等 }
再定义业务实体(以Product为例),通过TitleTxId和DescriptionTxId关联翻译表:
public class Product { public int Id { get; set; } public string Sku { get; set; } // 产品自身的非翻译属性 // 翻译外键字段 public int TitleTxId { get; set; } public int DescriptionTxId { get; set; } // 导航属性 public Translation TitleTranslation { get; set; } public Translation DescriptionTranslation { get; set; } }
2. Fluent API关系配置
在DbContext的OnModelCreating方法中,为业务实体与翻译表的两个关联关系分别配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Product与标题翻译的关联 modelBuilder.Entity<Product>() .HasOne(p => p.TitleTranslation) .WithMany() // 翻译表无需反向导航业务实体,使用无参WithMany() .HasForeignKey(p => p.TitleTxId) .OnDelete(DeleteBehavior.Restrict); // 避免删除翻译时误删产品,可按需调整 // 配置Product与描述翻译的关联 modelBuilder.Entity<Product>() .HasOne(p => p.DescriptionTranslation) .WithMany() .HasForeignKey(p => p.DescriptionTxId) .OnDelete(DeleteBehavior.Restrict); // 配置翻译表的主键与索引 modelBuilder.Entity<Translation>() .HasKey(t => t.Id); modelBuilder.Entity<Translation>() .HasIndex(t => t.LanguageCode); }
核心设计说明
Translations表完全通用,无需添加任何业务实体专属外键(如ProductId),后续新增需要翻译的实体(如Category、Article)时,只需添加对应的XXXTxId字段和导航属性,重复上述配置逻辑即可。- 无参
WithMany()确保翻译表不持有业务实体的反向引用,维持其通用性。 OnDelete(DeleteBehavior.Restrict)用于防止级联删除导致的业务数据丢失,可根据实际需求调整为Cascade(允许级联删除)或SetNull(需将外键字段设为可空)。
内容的提问来源于stack exchange,提问作者Mil
相关产品推荐
相关产品推荐

