使用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'类型。验证它是否没有显式地从模型中排除,并且它是一个有效的原语属性。

那么这到底能不能做到呢?

使用Fluent API将.net类型映射到数据库

不能将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); }
    }
}