EF Core 值转换及设置默认值注意事项

本文探讨了EFCore在.NET 5中如何进行值转换,特别是在SQLServer 2005环境下遇到的挑战。枚举类型转换到varchar没有问题,但转换到char会导致数据丢失。同时,bit类型默认值设为boolean也会引发数据丢失。对于不支持datetime2的低版本SQLServer,需要显式指定datetime类型。文章提供了具体的 FluentAPI 和属性注解示例来解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EF Core 目前已经非常完善了。值转换在2.1就支持了。具体版本有兴趣的可以看看

运行环境

SQL Server 2005
.Net 5

值转换注意事项

枚举类型不能转char

枚举转数据库varchar非常容易,直接使用Fluent API或者属性设置转换格式

// Fluent API
builder.Entry<Person>.Property(e => e.Level).HasConversion(v => v.ToString(), v => (Level)Enum.Parse(typeof(Level), v));
// 或者使用内置的转换器
builder.Entry<Person>.Property(e => e.Level).HasConversion<string>();

// 或者喜欢用属性的也可以
public class Person {
	[Column(TypeName = "varchar(1)")] // 就这句就可以了,默认转成varchar
	public Level Level{get;set;}

}

public enum Level
{
	High,
	Low
}

关键的地方来了,char不行,插入会提示NULL,及数据丢失了。

public class Person {
	[Column(TypeName = "char(1)")] // <---就这里,char就完犊子了,丢数据
	public Level Level{get;set;}	
}

bit默认值设置成boolean,会丢失数据,提示NULL

public class Person {
	[Column(TypeName = "char(1)")] // <---就这里,char就完犊子了,丢数据
	public Level Level{get;set;}	
	
	[Column(TypeName = "bit")] // <---bit,值转换没问题
	public bool IsFailed{get;set;}
}

// 默认值目前只能用Fluent API
builder.Entry<Person>.Property(e => e.IsFailed).HasDefaultValue(false); //<---这样设置后,数据就丢失了。。

datetime2在SQL Server 2008以下版本是不支持的

默认情况下,DateTime类型会默认转换为datetime2,但是低版本的数据库是不支持datetime2类型的
解决方案:

public class Person {
	[Column(TypeName = "char(1)")] // <---就这里,char就完犊子了,丢数据
	public Level Level{get;set;}	
	
	[Column(TypeName = "bit")] // <---bit,值转换没问题
	public bool IsFailed{get;set;}

	[Column(TypeName = "datetime")] // 显式指定转换类型,就解决了低版本不支持datetime2的问题了
	public DateTime BirthDay{get;set;}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值