实体框架6过滤了索引

时间:2018-01-27 11:23:06

标签: c# entity-framework annotations entity-framework-6 ef-code-first

我正在使用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)

在这两个函数中,我都可以AnnotationValueColumnModel获得AnnotationValues values; if (column.Annotations.TryGetValue(nameof(SqlDefaultValueAttribute), out values)) { column.DefaultValue = values.NewValue; }

MigrateDatabaseToLatestVersion

因此,将初始化策略设置为AutoMigration时,每次模型更改时,我的数据库都会更改并且默认值设置正确。

现在我想为索引做同样的事情。

如何为Generate(CreateIndexOperation createIndexOperation) 设置的索引定义自定义注释?

有一个

AnonymousArguments

用于覆盖,但我不知道如何为createIndexOperation设置createIndexOperation.ColumnsColumnModel是一个字符串列表,而不是Up)。

有一些方法,例如手动迁移和覆盖DownCreateIndex功能并覆盖System.InvalidOperationException,但我希望自动完成,无需手动迁移。

0 个答案:

没有答案