Entity framework 实体框架将DateTimeOffset映射到SQL Server DateTime

Entity framework 实体框架将DateTimeOffset映射到SQL Server DateTime,entity-framework,mapping,ef-code-first,datetimeoffset,Entity Framework,Mapping,Ef Code First,Datetimeoffset,有没有一种方法可以将DateTimeOffset属性映射到SQL Serverdatetime列,并且假设您不能更改任何一方,这意味着属性和列必须保留这些日期类型 我知道最简单的方法就是让他们匹配,但我想知道是否有办法解决这个问题。我正在研究自定义映射,但似乎我必须自己映射所有列,而不仅仅是DateTimeOffset属性 我试过: modelBuilder.Entity<Customer>().Property(c => c.LastModifiedOn).HasColumn

有没有一种方法可以将
DateTimeOffset
属性映射到SQL Server
datetime
列,并且假设您不能更改任何一方,这意味着属性和列必须保留这些日期类型

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

我试过:

modelBuilder.Entity<Customer>().Property(c => c.LastModifiedOn).HasColumnType("datetime");
modelBuilder.Entity().Property(c=>c.LastModifiedOn).HasColumnType(“日期时间”);
但是抛出指定的
成员映射的操作无效
错误


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

否。
DateTimeOffset
在.NET类中将映射为
DateTimeOffset
SQL类型。您不能直接更改此行为,因为EF不提供简单的类型转换/映射。如果要将其存储为
DateTime
,则必须对其进行破解

首先使用技巧定义Customer类,将私有属性公开到@cincura.net中引用的映射:


无论如何,为什么不直接使用
DateTime
并将其存储在UTC?

感谢您的回复。我们必须处理多个时区,使用DateTimeOffset进行运算比在对时间进行任何运算之前必须将所有内容转换为UTC更容易。使用EF避免使用DateTime的一个原因是值不会往返:所有值都使用DateTimeKind.Unspecified加载。没有办法告诉EF它应该默认为UTC。当然有修复它的黑客,但它们很难看,有些可能会影响性能(使用ObjectContext事件)。@SørenBoisen-在我创建表的迁移过程中,我只添加了
defaultValueSql:“GETUTCDATE()”
完整示例:
CreatedDate=c.DateTime(nullable:false,精度:7,storeType:“datetime2”,defaultValueSql:“GETUTCDATE()”,
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; }
}
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");
    }
}