Entity framework core 如何将可为null的tinyint列映射到EF Core中null变为false的bool?
我为SqlServer数据库维护了一套应用程序,该数据库没有简单的创建过程,生产中的各种实例略有不同(关于列的可空性和varchar大小)。我正在将这些应用程序的数据层从EF 6移动到EF Core 2.1,以增加平台支持,并最终以一种简单的方式创建具有一致布局的新数据库 我可能会借此机会清理一下我的POCO。我希望消除的一种模式是,原始SqlServer数据库通常使用Entity framework core 如何将可为null的tinyint列映射到EF Core中null变为false的bool?,entity-framework-core,Entity Framework Core,我为SqlServer数据库维护了一套应用程序,该数据库没有简单的创建过程,生产中的各种实例略有不同(关于列的可空性和varchar大小)。我正在将这些应用程序的数据层从EF 6移动到EF Core 2.1,以增加平台支持,并最终以一种简单的方式创建具有一致布局的新数据库 我可能会借此机会清理一下我的POCO。我希望消除的一种模式是,原始SqlServer数据库通常使用tinyintnull,而不是对bit列进行默认约束。在我的C代码中,它们被映射到byte?而不是bool,我认为这不必要地使它
tinyintnull
,而不是对bit
列进行默认约束。在我的C代码中,它们被映射到byte?
而不是bool
,我认为这不必要地使它们的使用复杂化。接下来,我希望新数据库改用位字段,在许多情况下,它们不为null并默认为0是合适的。我已经实现了这一点,但我认为,利用EF Core的所有灵活性,我应该能够对我的DbContext进行子类化,并提供不同的映射,以便使相同的代码能够在原始的“遗留”数据库上运行,而这些数据库仍然是可为空的tinyint
尝试1
我希望在我的LegacyDbContext子类中使用ValueConverter
来实现这一点(将其传递到PropertyBuilder.HasConversion
),直到我了解到在的限制部分下这些不能用于转换空值,所以我得到一个系统。invalidoOperationException
声明:
读取属性“”的数据库值时发生异常。预期类型为“System.Boolean”,但实际值为null。
尝试2
正在注册自定义Microsoft.EntityFrameworkCore.Metadata.Internal.IEntityMaterializerSource
实现,以便为我处理此转换,但我也无法使其正常工作,我认为调用它太晚,无法执行类型转换
当然,在从字节到bool的类型转换之前,可以用0替换null,或者使用bool映射回旧数据库的可为null的tinyint的其他机制来完成我的新POCO