gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:01:48 24 4
gpt4 key购买 nike

NHibernate 可以使用 IUserType 的新实现进行扩展,因此我可以自定义映射属性如何被读取和存储到/从数据库中。
一个例子。如果我希望 DB null varchar 加载为“n/a”字符串,并且“n/a”字符串存储为 null。
EF 6.2 怎么可能?
我正在寻找一种不会破坏变更跟踪器的解决方案。

最佳答案

从 EF 6.2 开始,库没有提供开箱即用的此类功能。
如果您决定改用 EF Core,则可以使用 HasConversion 功能。
但是,在您的情况下,您仍然无法使用它,因为有一个警告:它不能用于转换空值。 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 .然后,您可以读取/写入私有(private)支持字段/从私有(private)支持字段中读取/写入,然后让公共(public)属性处理 null 值。
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有关如何实现它的说明。

关于entity-framework - 使用新的映射规则扩展 EF 6.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66427554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com