有没有办法映射 DateTimeOffset
属性到 SQL Server datetime
列,假设您不能更改任何一方,这意味着属性和列必须保留那些日期类型?
我知道最简单的方法是让它们匹配,但想知道是否有办法解决这个问题。我正在研究自定义映射,但似乎我必须自己映射所有列,而不仅仅是 DateTimeOffset
属性(property)。
我试过:
modelBuilder.Entity<Customer>().Property(c => c.LastModifiedOn).HasColumnType("datetime");
但这抛出了Member Mapping specified is not valid
错误。我希望能够把
UtcDateTime DateTimeOffset
数据库中的属性值和读取时有 DateTimeOffset
使用 UTC(即偏移量为零)。
最佳答案
号码DateTimeOffset
在 .NET 类中将映射到 DateTimeOffset
SQL 类型。您不能直接更改此行为,因为 EF 不提供简单的类型转换/映射。如果要存储为 DateTime
你必须破解它。
首先定义 Customer 类,使用技巧将私有(private)属性暴露给 this post 中@cincura.net 引用的映射。 :
public class Customer
{
public static class CustomerExpressions
{
public static readonly Expression<Func<Customer, DateTime>> LastModifiedOn = c => c.LastModifiedOnInternal;
}
// Other properties
public DateTimeOffset LastModifiedOn
{
get { return new DateTimeOffset(LastModifiedOnInternal); }
set { LastModifiedOnInternal = value.DateTime; }
}
private DateTime LastModifiedOnInternal { get; set; }
}
现在您有两个属性 - 一个是私有(private)的并持有
DataTime
你想持久化到数据库中,一个是公开的 DateTimeOffset
为您的应用程序。在您的上下文中定义它:public class Context : DbContext
{
public DbSet<Customer> Customers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().Ignore(c => c.LastModifiedOn);
modelBuilder.Entity<Customer>().Property(Customer.CustomerExpressions.LastModifiedOn).HasColumnName("LastModifiedOn");
}
}
无论如何你为什么不使用
DateTime
直接并将其存储在UTC?
关于entity-framework - Entity Framework 将 DateTimeOffset 映射到 SQL Server DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9389954/