![](/img/trans.png)
[英]Entity Framework Core with SQLite: ASP.NET application holding onto database in memory
[英]Setting DateTimeKind for SQLite database in ASP.NET Core with Entity Framework
我有一个 ASP.NET 核心应用程序,它连接到 sqlite 数据库。 尽管我使用所有DateTime
值作为 UTC(使用DateTime.UtcNow
和value.ToUniversalTime()
),但我仍然从数据库中获取日期时间值DateTimeKind.Unspecified
。
我试图在连接字符串中设置DateTimeKind=Utc
,但后来我得到了
System.ArgumentException:不支持关键字:'datetimekind'
对于代码
var context = services.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();
我也已经尝试过这个解决方案:
services.AddDbContext<ApplicationDbContext>(options =>
{
var connectionString = Configuration.GetConnectionString("DatabaseConnection");
var conn = new SQLiteConnection(connectionString);
conn.Open();
var x = options.UseSqlite(
conn
);
});
但它在迁移时仍然会产生相同的错误。
我觉得Migrate
function 创建了自己的连接,因为堆栈跟踪看起来像:
at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder.GetIndex(String keyword)
at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder.set_Item(String keyword, Object value)
at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)
at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder..ctor(String connectionString)
at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists()
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)
有人注意到堆栈跟踪通过
Microsoft.Data.Sqlite.SqliteConnectionStringBuilder
但我不知道为什么会这样。
对迁移的调用如下所示:
var context = services.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();
据我了解, context
应包括基于SQLiteConnection
class 的 SQLite 连接。
我的解决方案声明这个 class
public static class DateTimeExtensions
{
public static DateTime ToUtc(this DateTime value)
{
if (value.Kind == DateTimeKind.Unspecified)
{
value = DateTime.SpecifyKind(value, DateTimeKind.Utc);
}
else if (value.Kind == DateTimeKind.Local)
{
value = value.ToUniversalTime();
}
return value;
}
public static DateTime? ToUtc(this DateTime? value)
{
if (value.HasValue)
{
return ToUtc(value.Value);
}
return value;
}
}
然后声明 DateTime 属性,如
private DateTime __Fecha;
public DateTime Fecha { get => __Fecha; set => __Fecha = value.ToUtc(); }
警告阅读本文,不要使用 _Fecha 或 EF 阅读不要使用 set 方法。 支持字段
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.