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

Entity framework 使用新的映射规则扩展EF 6.2,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,NHibernate可以通过IUserType的新实现进行扩展,因此我可以自定义映射属性在数据库中的读取和存储方式 举个例子。如果我希望DB null varchar加载为“n/a”字符串,“n/a”字符串存储为null EF 6.2如何实现这一点 我正在寻找一种不会破坏更改跟踪程序的解决方案。从EF 6.2开始,库中没有现成的功能 如果您决定改为使用EF Core,则可以使用该功能 但是,在您的情况下,您仍然无法使用它,因为有一个警告:它不能用于转换空值。空值总是转换为空值。发件人: 空值永远

NHibernate可以通过IUserType的新实现进行扩展,因此我可以自定义映射属性在数据库中的读取和存储方式

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

EF 6.2如何实现这一点


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

从EF 6.2开始,库中没有现成的功能

如果您决定改为使用EF Core,则可以使用该功能

但是,在您的情况下,您仍然无法使用它,因为有一个警告:它不能用于转换空值。空值总是转换为空值。发件人:

空值永远不会传递给值转换器。数据库列中的null在实体实例中始终为null,反之亦然。这使得转换的实现更加容易,并允许在可为null和不可为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  }
}

除此之外,如果您想通过将属性设置为私有来隐藏映射到DB的属性,那么这并不像EF Core的支持字段那样简单,但是您可以按照说明来实现它。

EF 6中是否有像EF Core中那样的
HasConversion
之类的内容?不幸的是没有。但是我希望有一些低级的钩子,我可以用它来模拟这个扩展(HasConversion),如果你不能去EF-core,那么你可以看看这个HasConversion是如何在那里实现的,如果可以通过扩展代码来实现的话,现在就对EF(非core)做同样的事情,我很好。如果我需要修改EF代码,这是不可能的。谢谢,但这是不可能的,因为这会扰乱我们的领域模型。我需要EF中的一个钩子来控制映射逻辑。是的,这只是EF6.2。实际上NotMapped是我们当前的解决方案,但我需要摆脱这个:)如果我能使用Nhibernate:)@Stig,我理解,但EF6没有那个功能,不幸的是,所以没有办法,他们也不打算添加它(参考文献)+1来获得我的答案@Stig你应该努力向你的PO/SM/CTO/CEO或任何决定你迟早要从EF转到EFCore的人解释,不仅是因为这个原因(转换),还有很多其他ADN数据(只看EFCore5)和@CantleepNow,我也会考虑搬到EF核心:我们已经把一个大应用程序从EF 6移植到EF核心3.1,它并不像我最初预期的那么差。现在EF Core 5支持多对多关系应该更容易了