如何在 EF Core 中有效地对可翻译属性建模?

How can I effectively model Translatable Properties in EF Core?

我正在使用 Entity Framework Core 和 PostgreSQL 在 .NET 5 上构建应用程序。在数据库中,我有几个包含字符串属性的实体,这些属性应该可以翻译成不同的语言。

我目前的做法是:

public class TString
    {
        public int Id { get; set; }
        
        /// <summary>
        /// The string value = Default Value
        /// </summary>
        public string Text { get; set; }
        
        public virtual ICollection<Translation> Translations { get; set; }

        /// <summary>
        /// Returns the translation for a given language or the default value.
        /// </summary>
        /// <param name="language"></param>
        /// <returns></returns>
        public string Get(string language)
        {
            if (Translations.Any(t => t.Language == language))
                return Translations.First(t => t.Language == language).Text;
            return Text;
        }
   }

    public class Translation
    {
        public int Id { get; set; }
        
        public int TStringId { get; set; }
        public virtual TString TString { get; set; }
        public string Language { get; set; }
        public string Text { get; set; }
    }

以及示例用法,例如:

    public class Product
    {
        public int Id { get; set; }
        
        public int NameId { get; set; }
        
        public virtual TString Name { get; set; }
  
        [...]
    }

上面的方法可行,但对我来说似乎很不优雅,因为在查询时,总是需要使用 .Include(x => x.Name).ThenInlude(n => n.Translations) 因为没有办法告诉 EF Core 默认加载 属性 除非你使用自有类型(这不是一个选项,因为那样你就不能使用 TString Id 进行查询),有没有更好的方法来做到这一点?

Since there is no way to tell EF Core to load a property by default unless you are using Owned Types

其实有——从EF Core 5.0开始,通过configuring navigation properties using the AutoInclude流利API,喜欢

modelBuilder.Entity<Product>()
    .Navigation(e => e.Name)
    .AutoInclude();

modelBuilder.Entity<TString>()
    .Navigation(e => e.Translations)
    .AutoInclude();