使用新的映射规则扩展 EF 6.2

Extend EF 6.2 with new mapping rules

NHibernate 可以使用 IUserType 的新实现进行扩展,因此我可以自定义映射 属性 的读取方式和存储 to/from 数据库的方式。

一个例子。如果我希望 DB null varchar 加载为“n/a”字符串,并将“n/a”字符串存储为 null.

EF 6.2 怎么可能做到这一点?

我正在寻找一种不会破坏更改跟踪器的解决方案。

从 EF 6.2 开始,库不提供开箱即用的此类功能。

如果您决定改用 EF Core,您可以在那里使用 HasConversion 功能。

但是,在您的情况下您仍然无法使用它,因为有一个警告:它不能用于转换 null 值。 Null 总是被转换为 null。来自 docs:

A null value will never be passed to a value converter. A null in a database column is always a null in the entity instance, and vice-versa. This makes the implementation of conversions easier and allows them to be shared amongst nullable and non-nullable properties. See GitHub issue #13850 for more information.

在那种情况下,我建议您将字符串 属性 配置为具有 Backing Field,而不是值转换。然后,您可以 read/write to/from 私有支持字段,然后让 public 属性 处理空值。

public class Blog
{
    private string _stringFromDb;

    public string MyString { get; set; }

    [BackingField(nameof(_stringFromDb))]
    public string MyString
    {
        get { return _stringFromDb ?? "n/a"; }
    }

    public void SetMyString(string myString)
    {
        // put your validation code here

        _stringFromDb = myString;
    }
}

在 EF 6.2 中,作为解决方法,您可以拥有的最接近的是 [NotMapped] 属性,它可以负责翻译您从数据库加载的 属性。

public string StringDB { get; set; }

[NotMapped]
public string StringConverted
{ 
    get { return MyStringProperty ?? "n/a"; }
    set { MyStringProperty = value  }
}

除此之外,如果您想隐藏 属性 映射到您的数据库,方法是将其设为 private,这不像使用 EF Core 的支持字段那样简单,但您可以按照 this other answer 了解如何实现它的说明。