0

我将 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())"));

而是有这样的东西

 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 回答