11

有没有办法将DateTimeOffset属性映射到 SQL Serverdatetime列,假设您不能更改任何一方,这意味着属性和列必须保留这些日期类型?

我知道最简单的方法是让它们匹配,但想知道是否有办法解决这个问题。我正在研究自定义映射,但似乎我必须自己映射所有列,而不仅仅是DateTimeOffset属性。

我试过:

modelBuilder.Entity<Customer>().Property(c => c.LastModifiedOn).HasColumnType("datetime");

但这引发了Member Mapping specified is not valid错误。

我希望能够将UtcDateTime DateTimeOffset属性值放入数据库中,并且在读取时使用DateTimeOffsetUTC(即偏移量为零)。

4

1 回答 1

18

.NET 类中的编号DateTimeOffset将映射到DateTimeOffsetSQL 类型。您不能直接更改此行为,因为 EF 不提供简单的类型转换/映射。如果你想存储它,DateTime你必须破解它。

首先定义 Customer 类,使用技巧将私有属性暴露给本文中@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; }
}

现在您有两个属性 - 一个是私有的,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 中?

于 2012-02-22T20:24:47.890 回答