如何使用 EF Core 保存 CultureInfo 类型的集合而不添加支持字段?

问题描述 投票:0回答:1

在课堂上,我有一个 ListOfficialLanguages 类型的集合。我需要尊重这个项目的领域驱动设计。我无法添加 ListficialLanguagesCodes 类型的支持字段并以这种方式处理它。

当我有像 User.Culture 这样的单个属性时,我可以在 OnModelCreating 中处理这样的转换:

modelBuilder.Entity<User>().Property(u => u.Culture).HasConversion(c => c.Name, s => new(s));

我怎样才能实现类似的收藏?

我在集合上尝试了模型生成器 HasConversion 但没有工作:

 modelBuilder.Entity<Community>().Property(c => c.OfficialLanguages).HasConversion(l => string.Join(',', l), s => s.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList());

entity-framework-core
1个回答
0
投票

仅存储语言字符串。如果您已经加载了支持的

CultureInfo
的查找列表,那么您的实体或更好,投影视图模型可以提供一个 getter,从可用列表中查找它或组成一个新的
CultureInfo
实例。我的意思是,如果您有一个使用颜色的系统,那么在数据库中仅存储 ARGB 值是有意义的,而不是 .Net
Color
对象。

public class SomeViewModel
{
    public string LanguageName { get; set; }

    public CultureInfo? CultureInfo => SupportedCultures.FirstOrDefault(x=> x.Name == LanguageName);
}

其中“SupportedCultures”是受支持语言的静态单例,根据您认为适合的异常或默认值等处理不支持的字符串。(上面仅返回#null)

或者:

public CultureInfo? CultureInfo => new CultureInfo(LanguageName);

处理为指定语言名称创建文化信息,相信该值将始终是受支持的值,但允许较旧的不受支持的内容正常工作。

您可以将只读访问器放在实体本身中,但它实际上仅适用于基于 UI 的逻辑,并且必须用

[NotMapped]
属性进行标记,因为它不是您能够在其中查询的内容Linq 表达式。 (您可以使用语言名称进行任何查询。

© www.soinside.com 2019 - 2024. All rights reserved.