使用新的映射规则扩展 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 了解如何实现它的说明。
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 了解如何实现它的说明。