【发布时间】:2021-10-20 09:47:14
【问题描述】:
我需要使用 EntityFramework 从 C# 中将日期字段类型“datetime”保存在数据库中。
在 MySql 中工作正常,但在 Sqlsrv 中没有。
这个想法是系统可以使用 MySql 或 SqlSrv,这就是我使用 datetime 而不是 datetime2 的原因。
我的模特:
public partial class Entity: ITimeStamp
{
public long Id { get; set; }
public string Name { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
我的 DbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder) {
.......
modelBuilder.Entity<Entity>(entity =>
{
entity.ToTable("entities");
entity.HasIndex(e => e.Name, "entities_name_unique")
.IsUnique();
entity.Property(e => e.Id)
.HasColumnType("int")
.HasColumnName("id").ValueGeneratedOnAdd();
entity.Property(e => e.CreatedAt)
.HasColumnType("datetime")
.HasColumnName("created_at");
entity.Property(e => e.Name)
.IsRequired()
.HasColumnType("varchar(255)")
.HasColumnName("name");
entity.Property(e => e.UpdatedAt)
.HasColumnType("datetime")
.HasColumnName("updated_at");
});
......
}
public override int SaveChanges()
{
var entries = ChangeTracker
.Entries()
.Where(e => e.Entity is ITimeStamp && (
e.State is EntityState.Added or EntityState.Modified));
foreach (var entityEntry in entries)
{
((ITimeStamp)entityEntry.Entity).UpdatedAt = DateTime.Now;
if (entityEntry.State == EntityState.Added)
{
((ITimeStamp)entityEntry.Entity).CreatedAt = DateTime.Now;
}
}
return base.SaveChanges();
}
我的控制器:
var entity = new Entity
{
Name = installer.CompanyName,
...
};
_context.Entities.Add(entity);
await _context.SaveChangesAsync();
例外:
System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
at Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__169_0(Task`1 result)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.<>c.<.cctor>b__277_0(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
我尝试将字段设置为可为空,但它没有抛出异常,而是不保存任何日期。
【问题讨论】:
-
又一个想法。您的日期时间在数据库中可以为空吗?如果是这样,那么也许在 DateTime 变量的末尾做一个 .Value 可以解决这个问题。
标签: c# sql-server entity-framework asp.net-core entity-framework-core