gpt4 book ai didi

entity-framework - Entity Framework 6 Code first 覆盖 MigrationCodeGenerator 的默认值

转载 作者:行者123 更新时间:2023-12-03 17:34:34 25 4
gpt4 key购买 nike

我发现的所有关于声明默认值的方法都是在 Sql 脚本中生成默认值,而不是在迁移代码中。

我最喜欢使用属性:https://stackoverflow.com/a/34894274/132942

[SqlDefaultValue(DefaultValue = "getutcdate()")]
public DateTime CreatedDateUtc { get; set; }

属性定义
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SqlDefaultValueAttribute : Attribute
{
public string DefaultValue { get; set; }
}

在上下文的“OnModelCreating”中添加
modelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));

然后定制 SqlGenerator .但我不喜欢这样,因为我不知道在生成迁移时是否一切都如我所愿。

为此,我修改了 迁移代码生成器 像这样: https://stackoverflow.com/a/21024108

在自定义 MigrationCodeGenerator
public class ExtendedMigrationCodeGenerator : MigrationCodeGenerator
{
public override ScaffoldedMigration Generate(string migrationId, IEnumerable<MigrationOperation> operations, string sourceModel, string targetModel, string @namespace, string className)
{
foreach (MigrationOperation operation in operations)
{
if (operation is CreateTableOperation)
{
foreach (var column in ((CreateTableOperation)operation).Columns)
{
System.Data.Entity.Infrastructure.Annotations.AnnotationValues values;
if (column.Annotations.TryGetValue("SqlDefaultValue", out values))
{
column.DefaultValueSql = (string)values.NewValue;
}
}
}
else if (operation is AddColumnOperation)
{
ColumnModel column = ((AddColumnOperation)operation).Column;

System.Data.Entity.Infrastructure.Annotations.AnnotationValues values;
if (column.Annotations.TryGetValue("SqlDefaultValue", out values))
{
column.DefaultValueSql = (string)values.NewValue;
}

}
}

CSharpMigrationCodeGenerator generator = new CSharpMigrationCodeGenerator();

return generator.Generate(migrationId, operations, sourceModel, targetModel, @namespace, className);
}
}

但是在方法 脚手架迁移 我无法获得自定义注释 SqlDefaultValue 或任何其他注释。

有没有可能得到这个注解?

最佳答案

您尚未说明您如何注册 ExtendedMigrationCodeGenerator要使用,您可以在 Configuration 的构造函数中执行此操作类(class) Configuration.cs例如:

public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
// Register the Customized Migration Generator to use
CodeGenerator = new ExtendedMigrationCodeGenerator();
}
但也不要忘记 AlterColumnOperation如果您将其应用于现有架构,这可能是您最大的问题。
else if (operation is AlterColumnOperation alterColumnOp)
{
ColumnModel column = alterColumnOp.Column;

System.Data.Entity.Infrastructure.Annotations.AnnotationValues values;
if (column.Annotations.TryGetValue("SqlDefaultValue", out values))
{
column.DefaultValueSql = (string)values.NewValue;
}
}
您将看不到生成输出的另一种情况是,如果在配置自定义 ExtendedMigrationCodeGenerator 之前生成的先前迁移中已经应用了约定和注释。 .
调试提示:
调试自定义迁移逻辑并不像设置断点那么简单,因为它通常由像 Migration.exe这样的外部进程执行。 .因此,在断点生效之前,我们需要调用调试器,我们可以通过在要调试的点或迁移代码生成器类的构造函数中插入以下代码来实现此目的:
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();

It is better to attach in a constructor rather than near the code you want to debug because we know the constructor should be executed under normal conditions, but the reason your code isn't working might be due to the method or code branch not being executed at all, if it's not being executed, then the Launch() command also will not be executed.


如果您使用此方法来调试迁移并且您没有看到调试附加对话框,那么要么没有检测到迁移,要么您的 ExtendedMigrationCodeGenerator没有被正确注册。

关于entity-framework - Entity Framework 6 Code first 覆盖 MigrationCodeGenerator 的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com