5

System.DateTimeSQL Server の DateTime よりも広い範囲の値を取ることができます。したがってSystem.Data.SqlTypes.SqlDateTime、後者を模倣するクラスがあります。

したがって、Entity Framework が SqlDateTime を選択することを期待していましたが、そうではありませんでした。

だから私の質問は...

DateTime 値をデータベースに保存するときに問題が発生しないようにするためのベスト プラクティスは何ですか?

EFにSqlDateTimeの使用を強制する方法はありますか?

4

3 に答える 3

4

できることはたくさんあります。

  • SQL Server 2008 以降を使用している場合は、.NET と同じ日付範囲を提供するデータベースでDATEまたはデータ型を使用できます。DATETIME2DateTime

  • これらの新しいデータ型を使用できない場合は、データが永続ストアに格納される前に、日付フィールドのチェック/検証を処理する必要があります。EFEntityObjectには、オブジェクトの検証と保存のプロセスを活用するためのさまざまな方法が用意されています。

于 2010-10-15T17:04:51.233 に答える
1

より具体的には、これを試してください: http://www.vfstech.com/?p=111

于 2011-01-04T19:44:40.870 に答える
1

たぶんこれは古いスレッドですが、他の人のためにこれに関する私の調査結果を投稿します:

dev env があるとしましょう: EF 5, CodeFirst, SqlCE 4.0:

public abstract class Entity : IEntity, IEquatable<Entity>
{
public virtual int Id { get; protected set; }
public virtual DateTime LastModified { get; set; }

[DataType(DataType.Date)]
public virtual DateTime CreatedOn { get; set; }

[DataType(DataType.DateTime)]
public virtual DateTime CreatedOn2 { get; set; }

[DataType(DataType.Time)]
public virtual DateTime CreatedOn3 { get; set; }

public virtual DateTime CreatedOn4 { get; set; }
}

このようなカスタム マッピングを使用すると、次のようになります。

public EntityMapping()
{
HasKey(e => e.Id);
Property(e => e.Id);
Property(e => e.LastModified).IsRequired().IsConcurrencyToken();
Property(e => e.CreatedOn).IsRequired();
Property(e => e.CreatedOn2).IsRequired();
Property(e => e.CreatedOn3).IsRequired();
Property(e => e.CreatedOn4).IsRequired();
}

これはthisを生成します。これは、オーバーフロー例外が発生することを意味します。

SQL CE 4.0 を使用しながら、マッピングを次のように変更します。

Property(e => e.CreatedOn).IsRequired().HasColumnType("datetime2");
Property(e => e.CreatedOn2).IsRequired().HasColumnType("date");
Property(e => e.CreatedOn3).IsRequired().HasColumnType("date");
Property(e => e.CreatedOn4).IsRequired().HasColumnType("datetime2");

このエラーが発生します。SQL Server Standart 2012 に切り替えると、問題が解決するようです (これは確かな解決策ではありません - 実験のためだけです)。作成した SQL Server スキーマはこれです。

私は Sql の専門家ではありませんが、SQL CE はこれらの日付をサポートしていないようです。開発環境の問題。残ります。DateTime は代用できますが、あちこちで多くのリファクタリングを行うことができます。

また、SqlDateTime と DateTime は大きく異なることにも注意してください。

コードとプロジェクトのライフサイクルにとって良いと思う解決策は、上記のstackoverflowのリンクの1つとカスタムfluentApiマッピング設定を組み合わせて提案されているように、LocalDbとSQL標準を切り替えて、モデルの作成を均等にすることです。

セーフティ ネットとしてEF にカスタム コンベンションを導入することも良さそうです。

コードと開発運用の両方について、より優れたオールラウンドなソリューションを誰かが持っている場合は、投稿してください。

于 2013-09-26T08:30:58.843 に答える