c# - 将列映射到 SQLlite 中的 DateTime 属性时如何忽略字符串空值?
问题描述
我使用实体框架从 C# 控制台应用程序中读取 SQLite 数据库。
这是问题所在:我有很多列包含空字符串(例如:'')并映射到 C# 中的 DateTime 属性。
当我尝试在这里阅读这些记录时,我得到了错误:
最里面的异常 System.FormatException : String '' 未被识别为有效的 DateTime。在 System.DateTimeParse.Parse(ReadOnlySpan`1 s, DateTimeFormatInfo dtfi, DateTimeStyles 样式) 在 Microsoft.Data.Sqlite.SqliteValueReader.GetDateTime(Int32 序数)
将该列映射到可为空的 DateTime 并不能解决问题。
明显的解决方案是清理所有这些空字符串并将它们替换为 NULL 值。在我的情况下这不是微不足道的,我不能保证将来不会有任何其他字符串空值。
令人惊讶的是,如果映射到整数的列包含空字符串值,它会起作用(值映射到“0”)。
映射到 DateTime 时有没有办法忽略那些空字符串值?(例如:它将返回一个空日期或 DateTime.MinValue)。注意:我使用 ISO 8601 格式而不是刻度。
编辑:这是我的代码
public class FooContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder builder) {
builder.UseSqlite("Data Source=Database.db");
}
public DbSet<Bar> Bar { get; set; }
}
public class Bar
{
public int ID { get; set; }
public DateTime? SomeDate { get; set; }
}
using(FooContext context = new FooContext())
{
var bar = context.Find<Bar>(id); //throw exception
}
解决方案
您可能必须在OnModelCreating
上下文类的方法上处理此问题。实际上你必须重写这个方法。在这种方法中,我们创建了一个转换器,用于转换我们从数据库中读取的属性值SomeDate
:
public class FooContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder builder) {
builder.UseSqlite("Data Source=Database.db");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
DateTime parsedDateTime;
var converter = new ValueConverter<string, DateTime?>(
v => string.IsNullOrWhiteSpace(v)
? null
: DateTime.TryParse(v, out parsedDateTime)
? parsedDateTime
: (DateTime?) null,
v => v != null
? v.ToString()
: string.Empty);
modelBuilder
.Entity<Bar>()
.Property(b=>b.SomeDate)
.HasConversion(converter);
}
public DbSet<Bar> Bar { get; set; }
}
您可以在此处阅读有关价值转换的更多信息。
推荐阅读
- algorithm - 多变量的复杂性
- operating-system - 进程驻留在辅助内存中时可以执行 IO 吗?
- java - 为什么 Spring Security 在所有表单帖子上总是以 403 Forbidden 响应?
- flutter - webdev 为 flutter_web helloworld 示例提供命令错误
- javascript - 带有反应导航的 React-Native 中 DrawerNavigator 中的问题
- python - 是 help() 和 license() 功能,但版权和学分不是?
- reactjs - 将 JS 文件导入 Next JS - 出现引用错误
- python - pip freeze 显示所有库,而不是我的虚拟环境中的库
- python - selenium 或其他网络爬虫工具是否对于将数据从 chrome 抓取到 python 脚本是强制性的
- python - 如何检查倒序字符串元组并将它们从 python 文件中删除?