在发送到数据库之前,将可转换为字符串类型的EF转换属性设置为字符串

时间:2014-10-16 17:53:39

标签: c# entity-framework ef-code-first

有没有办法告诉EF将我的MultilingualString属性转换为字符串,然后再将它们发送到数据库(以及从数据库中提取时的另一种方式)?我想包装行为以重用它。

public class MyEntity
{
    //  I want this property to be considered a string by EF (it is castable to string)
    public MultilingualString MyProperty { get; set; }
}

public class MultilingualString
{
    public static implicit operator string(MultilingualString mlString)
    {
        return mlString.ToJson();
    }

    public static explicit operator MultilingualString(string json)
    {
        return new MultilingualString(json);
    }

    ...
}

1 个答案:

答案 0 :(得分:1)

三个想法:

一种是从T4模板生成类,该模板将生成支持字段和[NotMapped] MultilingualString。从技术上讲,您将编写更少的代码,并且每个T4模板都可以使用您从另一个程序集中放入的方法,以避免在每个模板中重复生成代码。我确实承认,这个想法不会让你感觉更好。

思考二是使用PostSharp,对您的支持字段进行属性化并使PostSharp扩展创建多语言字段,反之亦然。这方面的一大缺点是静态分析工具不会那么喜欢它。

思考三是使MultilingualString成为ComplexType,其中包含字符串字段作为公共属性,并且还具有您构建该类的任何其他方法。如果你关心它,它将生成一个更混乱的数据库列名。

我认为3最有价值。

编辑:

对于选项3,您可以根据需要控制列名称:

modelBuilder.Entity<MyEntity>().Property(x => x.MyProperty.StringValue)
  .HasColumnName("i_dba_aprvd_rdbl_col_nm")

如果存在可以确定列名的规则,例如,没有理由使用反射来生成这种流畅的配置以找到所有这些复杂的属性值。它是实体上MultilingualString类型的属性的名称。