0

Code First Approach で EF 5 を使用しています。

DateTime列のデフォルト値を(getdateutc())

私がやりたいのは、この値を指定して EF にテーブルを設定させることです。それが可能であることがわかった唯一の方法は、DbMigrations(Up メソッドと Down メソッド) を使用することです。他の方法はありますか?

私はこのような基本クラスを持っています

 public abstract class BASE_AUDITED : BASE
 {              
      [IgnoreDataMember, IgnoreMap]
      public DateTime Created { get; set; }

      [IgnoreDataMember, IgnoreMap]
      public DateTime Modified { get; set; }

      [MaxLength(50)]
      [IgnoreDataMember, IgnoreMap]
      public string CreatedBy { get; set; }

      [MaxLength(50)]
      [IgnoreDataMember, IgnoreMap]
      public string ModifiedBy { get; set; }
 }

 public abstract class BASE 
 {
      [IgnoreMap]
      public int id { get; set; }
 }

そして、それを継承する一連のクラス。私がやりたいことはfluentAPI、DBMigrations Up メソッドで (マッピングに使用して) モデルにアクセスし、そこにループを記述して、継承するすべてのオブジェクトを処理できるようにすることです。Base_audited

つまり、追加するすべてのオブジェクトに対して次のコードを記述しないようにしています。

AlterColumn("T70_AccountService.CONTACT", "TestClmn", c => c.DateTime(nullable: false, defaultValueSql: "(getutcdate())"));

しかし、むしろこのようなsmthを持っています

 var types = ReflectionHelper.TypesImplementingInterface(typeof (BASE_AUDITED));
            foreach (var type in types)
            {
               var tableName = Context.FindTableNameFor(type);
               AlterColumn(tableName , "Created", c => c.DateTime(nullable: false, defaultValueSql: "(getutcdate())"));
               AlterColumn(tableName , "Modified", c => c.DateTime(nullable: false, defaultValueSql: "(getutcdate())"));

            }

要するに、DbMigrations Up メソッドでオブジェクトがマップされているテーブルを見つけることができません。

 var tableName = Context.FindTableNameFor(type);
4

1 に答える 1

0

私が実装した解決策は、(制約の再作成の) いくつかのオーバーヘッドで問題なく動作するように思われるためSeed、移行構成の " " メソッドを使用することです。

  protected override void Seed(AccountServiceEntities context)
        {
            //  This method will be called after migrating to the latest version.

            #region SET Defaults for Audit Fields

            var types = ReflectionHelper.GetEnumerableOfType<BASE_AUDITED>();
            foreach (var type in types)
            {
                var method = typeof(ContextExtensions).GetMethod("GetTableName");
                var generic = method.MakeGenericMethod(type.GetType());
                var table = generic.Invoke(this, new object[] { context });

                var constraintName = string.Format("DF__{0}__", type.GetType().Name);

                CreateDefaultCronstraint(context, table, constraintName, "Created");
                CreateDefaultCronstraint(context, table, constraintName, "Modified");

            }

            #endregion...

Context からテーブル名を抽出する変更された Context 拡張クラスを次に示します。 public static class ContextExtensions {

    public static string GetTableName<T>(this DbContext context) where T : class
    {
        var objectContext = ((IObjectContextAdapter)context).ObjectContext;
        return objectContext.GetTableName2<T>();
    }

    public static string GetTableName2<T>(this ObjectContext context) where T : class
    {
        var sql = context.CreateObjectSet<T>().ToTraceString();
        var regex = new Regex("FROM (?<table>.*) AS");
        var match = regex.Match(sql);

        var table = match.Groups["table"].Value;
        return table;
    }
}
于 2012-11-19T12:32:43.733 に答える