6

私は以下を含むviewModelを持っています:

public class CreateCardViewModel
    {
        [HiddenInput(DisplayValue = false)]
        public int SetId { get; set; }

        [Required]
        public IList<Side> Sides { get; set; }

        [Required]
        public int Stage { get; set; }

        [Required]
        [DataType(DataType.Date)]
        [HiddenInput(DisplayValue = false)]
        public DateTime DateCreated { get; set; }

        [Required]
        public bool IsReady { get; set; }

    }

モデルは次のとおりです。

public class Card
    {

        public virtual int CardId { get; set; }

        // belongs to a Set
        public virtual int SetId { get; set; }
        public virtual Set Set { get; set; }

        // has Sides
        public virtual IList<Side> Sides { get; set; }

        // is in a certain Stage
        public virtual int Stage { get; set; }

        // is ready to study
        public virtual bool IsReady { get; set; }

        public virtual DateTime DateCreated { get; set; }

    }

DateCreatedのデフォルト値を設定するにはどうすればよいですか?

カード作成時に空白のサイドをサイドに挿入したい場合、メソッドは変更されますか?

4

2 に答える 2

9

コンストラクターでデフォルトを設定できます。

public CreateCardViewModel()
{
    DateCreated = DateTime.Now;
    Sides = new List<Side> { new Side() };
}

警告:DateTime.Now単体テストの観点からの使用には問題があります。ViewModelの作成を単体テストしていて、作成された日付が既知の値に設定されていることを確認できる必要がある場合は、Ayendeのブログで詳しく説明されているように、時間の別の概念を作成することを検討できます。基本的に、静的関数を作成SystemTimeします。これは、テストで既知の値に設定できます。設定しない場合、デフォルトで次のようになりDateTime.Nowます。

public static class SystemTime
{
    public static Func<DateTime> Now = () => DateTime.Now;
}

コンストラクタコードは次のようになります。

public CreateCardViewModel()
{
    DateCreated = SystemTime.Now();
    Sides = new List<Side> { new Side() };
}

実際に時間を既知の値に設定する必要がある場合は、次のようにします。

SystemTime.Now = () => new DateTime(2013, 2, 11, 17, 41, 12);
于 2013-02-11T17:10:41.053 に答える
2

SystemTime アプローチに同意します。

ただし、個人的にはコンストラクターで CreatedDate を設定するのは好きではありません。オブジェクトをインスタンス化してからデータベースに永続化するまでに少し時間がかかる可能性があるためです。(そしてここでは、あなたが間違いなくそうであると仮定しています)

次のようなインターフェイスからすべてのドメイン オブジェクトを継承させることができます。

public interface ITimeStamped
{
    DateTime DateCreated { get; set; }
}

次に、Context クラスの Commit メソッドで、インターフェイスを実装するすべてのエンティティの日付を設定するために、次のようなことを行います。

foreach (var entry in ChangeTracker.Entries<ITimeStamped>()
                .Where(entry => entry.State == EntityState.Added))
            {
                entry.Entity.DateCreated = SystemTime.Now();
            }

このようにして、エンティティがデータベースに永続化されたときに、エンティティが正しい DateTime で格納されていることを完全に確信できます。

于 2013-02-11T17:55:15.477 に答える