EF 5 Code First DbMigration自动化

时间:2012-11-08 17:49:10

标签: c# .net entity-framework ef-code-first

我正在使用EF 5和Code First方法。

我无法将列的默认DateTime值设置为(getdateutc())

我想要做的是让EF设置表格,这个值是特定的,我发现可能的唯一方法是使用DbMigrations(向上和向下方法)。有其他方式吗?

我的基类看起来像这样

 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; }
 }

还有一大堆继承自它的类。 我想做的是能够在DBMigrations Up方法中访问模型(使用fluentAPI进行映射),并在那里编写一个循环来处理从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);

1 个答案:

答案 0 :(得分: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 extentions类,它从Context中提取表名 公共静态类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;
    }
}