我正在使用Entity Framework 6开发一个应用程序,我想使用过滤索引(带有where子句的索引)。在Entity Framework中有一个Index
注释,可以在属性(列)上定义索引。
我定义了类似
的内容public class SqlDefaultValueAttribute : Attribute
{
public object Value { get; set; }
public SqlDefaultValueAttribute(object value)
{
Value = value;
}
}
并像这样使用
public class MyEntity
{
[SqlDefaultValue(123)]
public int DefInt { get; set; }
}
然后在OnModelCreating
函数中,我写了类似这样的东西
modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, object>(nameof(SqlDefaultValueAttribute), (p, attributes) => attributes.Single().Value));
并在配置文件中像这样
public class Configuration : DbMigrationsConfiguration<MyContext>{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
SetSqlGenerator(SqlProviderServices.ProviderInvariantName, new CustomSqlServerMigrationSqlGenerator());
}
操纵EF生成的SQL
为了在创建列或创建表时创建默认值,我覆盖
Generate(CreateTableOperation createTableOperation)
和
Generate(AddColumnOperation addColumnOperation)
在这两个函数中,我都可以AnnotationValue
从ColumnModel
获得AnnotationValues values;
if (column.Annotations.TryGetValue(nameof(SqlDefaultValueAttribute), out values))
{
column.DefaultValue = values.NewValue;
}
MigrateDatabaseToLatestVersion
因此,将初始化策略设置为AutoMigration
时,每次模型更改时,我的数据库都会更改并且默认值设置正确。
现在我想为索引做同样的事情。
如何为Generate(CreateIndexOperation createIndexOperation)
设置的索引定义自定义注释?
有一个
AnonymousArguments
用于覆盖,但我不知道如何为createIndexOperation
设置createIndexOperation.Columns
(ColumnModel
是一个字符串列表,而不是Up
)。
有一些方法,例如手动迁移和覆盖Down
和CreateIndex
功能并覆盖System.InvalidOperationException
,但我希望自动完成,无需手动迁移。