如何在 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();
我正在使用 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();