使用 EF Core 6,代码优先,我希望有一个可以跨多个表使用的本地化表,以本地化表中的某些数据字段。
基本上,我想使用 SomeData 表中的 LocalizationKeyId 来引用 x 个本地化数量,它指定哪一列(名称)应具有特定的本地化文本。
我不知道如何使用 Fluent API 来映射它,其中 SomeData 上的 Localizations 集合会自动填充(包含时),并且 Localizations 表和要本地化的表之间存在外键约束,以保持数据完整性。
SomeData 中的 LocalizationKeyId 在插入时自动生成,无论有或没有任何本地化。
public class Localization
{
[Column(Order = 0)]
[Key]
public long Id { get; set; }
[Column(Order = 1)]
public Guid LocalizationKeyId { get; set; }
[Column(Order = 2)]
public long LocalizationLanguageId { get; set; }
[Column(Order = 3, TypeName = "nvarchar")]
[StringLength(100)]
public string Name { get; set; }
[Column(Order = 4, TypeName = "nvarchar")]
[StringLength(255)]
public string Value { get; set; }
public virtual LocalizationLanguage LocalizationLanguage { get; set; }
}
public class SomeData
{
[Column(Order = 0)]
[Key]
public long Id { get; set; }
[Column(Order = 1, TypeName = "nvarchar")]
[Required]
[StringLength(255)]
public string Name { get; set; }
[Column(Order = 2)]
public Guid LocalizationKeyId { get; set; }
public virtual ICollection<Localization> Localizations { get; set; }
}
您将无法通过这种方式将它们作为实体关联起来。集合通过关系子端的 FK 进行关联,您要查找的是:
SomeData.Localizations = {父级上给定 LocalizationKey 的所有本地化}
您可能会考虑的一个选择:
本地化通常是视图问题而不是数据问题,因此我将它们与实体分开对待。当我加载 SomeData 或 SomeData 集时,我将获取相关的 LocalizationKey 并使用它来检索适合所选语言的本地化。通常,当涉及到本地化时,本地化字符串将针对类型而不是数据记录的特定实例,因此视图模型类型名称之类的内容将用作本地化键,但会加载显式键:
var someData = await _context.SomeDatas
.Where(x => /* insert criteria */)
.Select(x => new SomeDataVM(LocalizationRepository)
{
// populate values including LocalizationKey
}).ToListAsync();
在这种情况下,LocalizationRepository 是一个注入的依赖项,可用于获取本地化详细信息。视图模型可以使用此本地化存储库依赖项来在需要时解决本地化问题。这不仅仅是 EF 的存储库包装器,而且是一个更纯粹的本地化字符串资源存储库,它将利用其自己的缓存等。它还可以确定当前适用的呼叫语言。当加载如上所述的数据集时,调用代码也可能预先缓存适用的项目:
var someData = await _context.SomeDatas
.Where(x => /* insert criteria */)
.Select(x => new SomeDataVM(LocalizationRepository)
{
// populate values including LocalizationKey
}).ToListAsync();
var localizationKeys = somData.Select(x => x.LocalizationKey)
.Distinct()
.ToList();
LocalizationRepository.Fetch(localizationKeys);
这将告诉存储库期望调用适用的本地化密钥,以确保它们已加载。这样,当访问视图模型 getter 时,本地化字符串就可以在缓存中使用,随时可以使用。