我正在使用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);
答案 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;
}
}