5

SQL Server データベース テーブルには、SQL Server によって自動生成されるフィールドがあり、このフィールドは と呼ばれCreatedTimeます。

データベース テーブル全体を Entity Framework のデータモデルにマップしたため、フィールドもマップしましたCreatedTime

したがって、Entity Framework を介してデータベースに新しい行を挿入する場合、 の値は提供されませんCreatedTime

これにより、挿入が次のエラーで失敗します。

SqlDateTime オーバーフロー。1753 年 1 月 1 日午前 12:00:00 から 9999 年 12 月 31 日午後 11:59:59 までの間である必要があります

質問は次のとおりです。Entity Framework の挿入ステートメントで、Entity データモデルの特定のフィールドを除外する方法はありますか? 上記のエラーが発生しないようにするには?

後でアクセスする可能性があるため、フィールドCreatedTimeを Entity モデルに保持したいと考えています。

4

5 に答える 5

8

Fluent API を使用している場合:

using System.ComponentModel.DataAnnotations.Schema;

this.Property(t => t.CreatedTime)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

注釈を使用する場合

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public System.DateTime CreatedTime { get; set; }
于 2014-02-13T21:02:53.193 に答える
4

このスレッドで問題の簡単な解決策を見つけました。

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/7db14342-b259-4973-ac09-93e183ae48bb

そこでフェルナンド・ソトは次のように書いています。

「EDM デザイナーに移動して、データベースによって自動生成されたテーブルのフィールドをクリックし、それを右クリックして [プロパティ] を選択し、プロパティ ウィンドウを見て、StoreGeneratedPattern をクリックし、その値を [計算済み] に設定します。あなたが探しているものをあなたに与えるでしょう。」

上記の解決策は非常に迅速かつ簡単で、うまくいくようです。

また、皆さんの貢献に感謝しますが、上記のソリューションはうまくいくようです。

于 2013-05-03T07:25:17.003 に答える
1

このプロパティで NotMapped 属性を使用してみて ください http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.notmappedattribute.aspx

于 2013-05-02T14:16:20.870 に答える
1

できることは 2 つあります。

  1. データベースにアクセスできる場合は、フィールドにdefault値があるかどうかを確認してください。に設定できない場合はGETDATE()、フィールドを正しく設定する必要があり、Entity Framework を介して追加/更新する必要はありません。

  2. データベースにアクセスできない場合、またはそこに変更を加えたくない場合は、Entity Data Model の動作を変更して日付を自動的に設定できます。ObjectContext モデルを拡張するだけです。

    public partial class MyEntities 
    {
        public override int SaveChanges() 
        {
            var entityChangeSet = ChangeTracker.Entries<SomeEntity>();
            if (entityChangeSet != null)
            {
                foreach (DbEntityEntry<SomeEntity> entry in entityChangeSet )
                {
                    switch (entry.State)
                    {
                        case EntityState.Modified:
                            entry.Entity.LastModifiedDate = DateTime.UtcNow;
                            break;
                        case EntityState.Added:
                            entry.Entity.CreatedDate = DateTime.UtcNow;
                            break;
                    }
                }
            }
            return base.SaveChanges();
        }
    }
    

この方法では、項目を追加または更新するときに、これらのフィールドに情報を追加する必要はありません。モデルが自動的に行います。この動作が必要なエンティティが複数ある場合は、インターフェイスを作成し、Entity クラスにそれを継承させることができます。

public interface IHaveCreatedDate {
    DateTime CreatedDate { get; set; }
}

public partial class MyEntity : IHaveCreatedDate {
    //MyEntity already implements this!
}

あとは、ChangeTracker への呼び出しを変更するだけです。

var entityChangeSet = ChangeTracker.Entries<IHaveCreatedDate>();
于 2013-05-02T14:22:24.087 に答える
0

CreatedTime はnull可能ですか?

考えられる回避策の 1 つ - CreatedTimeが null 許容でない場合:

DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);

if(myEntity.CreatedTime < sqlServerMinDateTime) 
{
    myEntity.CreatedTime = sqlServerMinDateTime;
}

// do insert here
// ....

考えられる回避策の 1 つ - CreatedTimeが null 許容の場合:

DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0);

if(myEntity.CreatedTime < sqlServerMinDateTime) 
{
    myEntity.CreatedTime = null;
}

// do insert here
// ....
于 2013-05-02T14:13:41.227 に答える