entity-framework - Entity Framework 将 DateTimeOffset 映射到 SQL Server DateTime

标签 entity-framework mapping ef-code-first datetimeoffset

有没有办法映射 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/

相关文章:

c# - Entity Framework 中可重用的映射方法,用于检索选定的列

asp.net-mvc - 学习 Entity Framework 与MVC一起使用,首先采取哪种方法?

c# - EF5 Code First - 使用迁移更改列类型

sql - LINQ 在查询中插入 'ESCAPE N' ~'

python - WeakValueDictionary 保留对没有更多强引用的对象的引用

java - 在 ibatis 上映射枚举

c# - MVC3/EF - 更改模型...数据库架构不匹配

c# - 如何在 LINQ 查询中分组和排序

c# - 如何使用 LINQ 和 Entity Framework 根据条件设置参数

entity-framework - EntityFramework代码优先和循环一对多引用