我为SqlServer数据库维护了一套应用程序,它没有简单的创建过程,生产中的各种实例都有细微差别(关于列和varchar大小的可空性)。我正在将这些应用程序的数据层从EF 6迁移到EF Core 2.1以增加平台支持,并最终以一种直接的方式创建具有一致布局的新数据库。
我可以借此机会在某种程度上清理我的POCO。我希望消除的一种模式是原始SqlServer数据库经常使用tinyint null
而不是bit
列,并对它们使用默认约束。这些映射到我的C#代码中的byte?
而不是bool
,我认为这些代码不必要地使它们的使用复杂化。展望未来,我希望新数据库能够使用位字段,而且在很多情况下,它们不适合它们并且默认为0.我有这个工作,但我认为具有EF的所有灵活性核心,我应该能够继承我的DbContext并提供不同的映射,以便使相同的代码能够针对原始的"遗产"这些数据库仍然是可以为空的tinyints。
尝试1
我希望在我的LegacyDbContext子类中使用ValueConverter<bool, byte?>
来完成此任务(将其传递到PropertyBuilder<bool>.HasConversion
)直到我了解到这些不能用于在EF Core docs的限制部分下转换空值,所以我得到System.InvalidOperationException
说明:
An exception occurred while reading a database value for property '<tableName>.<columnName>'. The expected type was 'System.Boolean' but the actual value was null.
尝试2
注册一个自定义的Microsoft.EntityFrameworkCore.Metadata.Internal.IEntityMaterializerSource
实现来为我处理这个转换,但是我也无法使用它,我认为对我来说调用类型转换太晚了......
当然可以在从byte到bool的类型转换之前将null替换为0,或者使用bool将其重新映射回旧数据库中可空的tinyint来实现我的新POCO的其他机制吗?