在课堂上,我有一个 List
当我有像 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());
仅存储语言字符串。如果您已经加载了支持的
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 表达式。 (您可以使用语言名称进行任何查询。