使用Fluent API将.net类型映射到数据库
本文关键字:映射 数据库 类型 net Fluent API 使用 | 更新日期: 2023-09-27 18:02:30
我使用CultureInfo
类来描述应用程序中可本地化数据的语言。
class LocalizedText
{
public int Id { get; set; }
public string Text { get; set; }
public CultureInfo Language { get; set; }
}
现在我想使用代码优先的方法将上面的类映射到数据库表。
样本数据:+----+------------------------+----------+ | Id | Text | Language | +----+------------------------+----------+ | 1 | Hello World! | en | +----+------------------------+----------+ | 1 | Hallo Welt! | de | +----+------------------------+----------+ | 1 | Bonjour tout le monde! | fr | +----+------------------------+----------+
我认为这将是很容易做到使用流畅的API在EF6,但我想它不是。
我试过了:
modelBuilder.Entity<CultureInfo>()
.HasKey(info => info.TwoLetterISOLanguageName);
但是我得到了一个错误。可能是因为CultureInfo.TwoLetterISOLanguageName
是只读的。
关键组件'TwoLetterISOLanguageName'没有声明属性设置为'CultureInfo'类型。验证它是否没有显式地从模型中排除,并且它是一个有效的原语属性。
那么这到底能不能做到呢?
不能将CultureInfo
类映射到数据库中的列。但是你可以忽略这个属性并创建另一个将被映射的字符串属性:
modelBuilder.Entity<LocalizedText>()
.Ignore(lt => lt.Language);
modelBuilder.Entity<LocalizedText>()
.Property(lt => lt.TwoLetterISOLanguageName)
.HasColumnName("Language");
当TwoLetterISOLanguageName
被赋值时,只设置Language
属性:
public class LocalizedText
{
public int Id { get; set; }
public string Text { get; set; }
public CultureInfo Language { get; set; }
public string TwoLetterISOLanguageName
{
get { return Language == null ? null : Language.TwoLetterISOLanguageName; }
set { Language = CultureInfo.GetCultureInfo(value); }
}
}