11

どちらの側も変更できないという前提で、プロパティと列がそれらの日付型のままでなければならないという前提で、DateTimeOffsetプロパティを SQL Server列にマップする方法はありますか?datetime

最も簡単なのはそれらを一致させることだとわかっていますが、これを回避する方法があるかどうか知りたいです。DateTimeOffsetカスタム マッピングを検討していましたが、プロパティだけでなく、すべての列を自分でマッピングする必要があるように思われました。

私は試した:

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

Member Mapping specified is not validしかし、それはエラーを投げました。

UtcDateTime DateTimeOffsetプロパティ値をDBに入れ、読み取り時にUTCにすることができるようにしたいと思っていましDateTimeOffsetた(つまり、オフセットがゼロです)。

4

1 に答える 1

18

DateTimeOffset.NET クラスのNo.はDateTimeOffsetSQL 型にマップされます。EF は単純な型変換/マッピングを提供しないため、この動作を直接変更することはできません。保存したい場合は、DateTimeハッキングする必要があります。

最初に、この投稿で @cincura.net によって参照されるマッピングにプライベート プロパティを公開するトリックを使用して Customer クラスを定義します。

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; }
}

これで、2 つのプロパティができました。1 つはプライベートで、DataTimeデータベースに永続化する保持であり、もう 1 つは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 に答える