120

System.ComponentModel DefaultValue 属性を使用して DateTime プロパティのデフォルト値を指定する方法を知っている人はいますか?

たとえば、私はこれを試します:

[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }

そして、値が定数式であることを期待しています。

これは、ASP.NET 動的データを使用するコンテキストにあります。DateCreated 列を足場にしたくはありませんが、存在しない場合は単に DateTime.Now を提供します。Entity Framework をデータ層として使用しています

乾杯、

アンドリュー

4

24 に答える 24

105

属性はコンパイル時に生成される単なるメタ情報であるため、これを行うことはできません。コンストラクターにコードを追加して、必要に応じて日付を初期化したり、トリガーを作成してデータベース内の欠損値を処理したり、バッキング フィールドが初期化されていない場合に DateTime.Now を返すようにゲッターを実装したりするだけです。

public DateTime DateCreated
{
   get
   {
      return this.dateCreated.HasValue
         ? this.dateCreated.Value
         : DateTime.Now;
   }

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;
于 2009-03-27T18:51:37.750 に答える
14

それは可能であり、非常に簡単です:

為にDateTime.MinValue

[System.ComponentModel.DefaultValue(typeof(DateTime), "")]

DefaultValueAttribute目的の DateTime 値を表す文字列を指定するの最後の引数として、その他の値を指定します。

この値は定数式でなければならず、 をDateTime使用してオブジェクト ( ) を作成するために必要ですTypeConverter

于 2012-02-15T10:41:59.050 に答える
6

Entity Framework を使用している場合の簡単な解決策は、部分的なクラスを追加し、エンティティのコンストラクターを定義することです。これは、フレームワークがエンティティーを定義していないためです。たとえば、Example という名前のエンティティがある場合は、次のコードを別のファイルに入れます。

namespace EntityExample
{
    public partial class Example : EntityObject
    {
        public Example()
        {
            // Initialize certain default values here.
            this._DateCreated = DateTime.Now;
        }
    }
}
于 2010-11-18T17:39:09.183 に答える
5

最も簡単な解決策は設定することだと思います

Created DATETIME2 NOT NULL DEFAULT GETDATE()

列宣言および VS2010 EntityModel デザイナーで、対応する列プロパティStoreGeneratedPattern = Computedを設定します。

于 2012-04-17T07:32:02.037 に答える
4

エンティティクラスのコンストラクターでその値を設定することを検討してください

public class Foo
{
       public DateTime DateCreated { get; set; }
       public Foo()
       {
           DateCreated = DateTime.Now;
       }

}
于 2013-04-23T21:39:50.913 に答える
4

新しい属性クラスを作成することをお勧めします。私の場合、「default(DateTime)」または「DateTime.MinValue」を指定して、Newtonsoft.Json シリアライザーが実際の値のない DateTime メンバーを無視するようにしました。

[JsonProperty( DefaultValueHandling = DefaultValueHandling.Ignore )]
[DefaultDateTime]
public DateTime EndTime;

public class DefaultDateTimeAttribute : DefaultValueAttribute
{
    public DefaultDateTimeAttribute()
        : base( default( DateTime ) ) { }

    public DefaultDateTimeAttribute( string dateTime )
        : base( DateTime.Parse( dateTime ) ) { }
}

DefaultValue 属性がない場合、DefaultValueHandling.Ignore オプションが設定されていても、JSON シリアライザーは「1/1/0001 12:00:00 AM」を出力します。

于 2011-06-03T20:52:36.187 に答える
3

デフォルト値として UTC タイムスタンプが必要だったので、ダニエルのソリューションを次のように変更しました。

    [Column(TypeName = "datetime2")]
    [XmlAttribute]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    [Display(Name = "Date Modified")]
    [DateRange(Min = "1900-01-01", Max = "2999-12-31")]
    public DateTime DateModified {
        get { return dateModified; }
        set { dateModified = value; } 
    }
    private DateTime dateModified = DateTime.Now.ToUniversalTime();

DateRangeAttribute のチュートリアルについては、この素晴らしいブログ投稿を参照してください

于 2011-05-25T01:38:03.917 に答える
0
public DateTime DateCreated
{
   get
   {
      return (this.dateCreated == default(DateTime))
         ? this.dateCreated = DateTime.Now
         : this.dateCreated;
   }

   set { this.dateCreated = value; }
}
private DateTime dateCreated = default(DateTime);
于 2010-07-07T17:00:11.533 に答える
0

現時点でこれにどのように対処するかは、Linq to SQL または EntityFramework を使用しているモデルによって異なりますか?

L2Sで追加できます

public partial class NWDataContext
{
    partial void InsertCategory(Category instance)
    {
        if(Instance.Date == null)
            Instance.Data = DateTime.Now;

        ExecuteDynamicInsert(instance);
    }
}

EF はもう少し複雑です。EF ビジネス ロジックの詳細については、 http: //msdn.microsoft.com/en-us/library/cc716714.aspx を参照してください。

于 2009-03-27T23:02:09.707 に答える
0

DatabaseGenerated 属性の使用を検討することもできます。例

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime DateCreated { get; set; }

https://docs.microsoft.com/en-us/ef/core/modeling/generated-properties?tabs=data-annotations

于 2021-05-30T11:19:58.440 に答える
-8

私もこれが欲しかったので、この解決策を思いつきました(日付部分のみを使用しています-デフォルトの時間はPropertyGridのデフォルトとして意味がありません):

public class DefaultDateAttribute : DefaultValueAttribute {
  public DefaultDateAttribute(short yearoffset)
    : base(DateTime.Now.AddYears(yearoffset).Date) {
  }
}

これは、DateTime プロパティに追加できる新しい属性を作成するだけです。たとえば、デフォルトが DateTime.Now.Date の場合:

[DefaultDate(0)]
于 2010-08-27T09:47:46.920 に答える