【问题标题】:Entity framework map placeholder value to null实体框架将占位符值映射为 null
【发布时间】:2015-02-12 13:05:48
【问题描述】:

在旧数据库中,NULL 值有时存储为字符串 NULL 和/或“x”。

我如何告诉 EF 我希望它自动将这些“占位符值”转换为 NULL

更新
我想通过两次拥有相同的属性来避免模型中的歧义/意外复杂性。 (如果人们可以获取/设置LegacyColumn,他们就会这样做并且抽象被破坏了)

【问题讨论】:

    标签: c# entity-framework entity-framework-6


    【解决方案1】:

    您可以基于未映射到数据库并执行所需转换的现有属性创建新属性。假设列名为Foo,您可以使用以下代码:

    [Column("Foo")]
    public String FooWithWeirdNullValues { get; set; }
    
    [NotMapped]
    public String Foo {
      get {
        return FooWithWeirdNullValues == "NULL" || FooWithWeirdNullValues == "x"
          ? null : FooWithWeirdNullValues;
      }
      set { FooWithWeirdNullValues = value; }
    }
    

    然后在您的代码中使用未映射的属性来访问Foo 列的值。

    您可能想为FooWithWeirdNullValues 选择另一个名称,例如LegacyFoo 或其他。您可以选择任何名称,只要您使用 Column 属性将其映射到数据库中的正确列即可。

    如果需要,您可以将 FooWithWeirdNullValues 设为私有,以免污染您的模型。这需要对DbContext 进行一些更改,如an answer on Stack Overflow on how to map private properties using code first 中所述。

    【讨论】:

    • 这会污染我的模型 :(。在 NHibernate 中这可以很容易地实现,我很惊讶 EF 没有这个?我希望EditorBrowsable(Never) 能解决这个问题,但它没有。
    • @Laoujin:我已经更新了我的答案,提供了一些额外的信息,可能会解决您对污染模型的担忧。
    猜你喜欢
    • 2010-10-09
    • 2011-04-30
    • 1970-01-01
    • 2017-02-11
    • 2011-03-09
    • 1970-01-01
    • 2015-08-17
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多