我有一个游戏模型,其值可以为DateTime
:
public class Game
{
[Key]
public int Id { get; set;}
public virtual ICollection<PlayerGames> Players { get; set;}
public DateTime StartTime { get; set; }
public DateTime? EndTime { get; set; }
public int? WinnersTeam { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Game> Games { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) {}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Game>().ToTable("Game");
modelBuilder.Entity<Game>()
.Property<DateTime?>(m => m.EndTime)
.IsRequired(false)
.ForSqliteHasColumnType("TEXT");
}
}
我的程序正在使用在Startup.cs中设置的Sqlite数据库:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
}
一切正常,但我无法读取EndTime
属性的值。但是,当我更新它时,它已成功存储在DB中。
请注意,DateTime
值作为TEXT
存储在Sqlite中。因此,例如,存储在DB中的值之一是“2017-01-06 20:35:44.880908”,但是当访问属性EndTime
时,程序始终返回“01/01/0001 00:07:42”。
如何告诉EF以正确的格式将文本从Sqlite解析为DateTime?
?
问题答案:
null
,则返回的值为null
,如果有任何其他值,则返回“01/01/0001 00:07:42”。我像这样访问了这个值:
public Game GetFirstGameEndTime()
{
var t = _context.Games.First().EndTime;
return t; // t in debuger is value either null or "01/01/0001 00:07:42"
}
答案 0 :(得分:1)
我发现的解决方案是将.NET Core更新到1.1.0并将软件包更新到新版本:
现在可以从DB
正确加载可以为空的DateTime答案 1 :(得分:0)
我的MS SQL DB有类似问题,为了避免这种情况,我必须首先检查变量是否不是DBNull.Value。如果它比我简单地为它分配了正常的空值。