ошибка при использовании адд-миграции с edmfunction - PullRequest
0 голосов
/ 09 января 2020

Я использую функцию EDM:

[DbFunction("dbo", "RemoveDiacritics")]
public static string RemoveDiacritics(string param)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

Я добавил это в ApplicationDBContextClass:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    //Register a convention so we can load our function
    modelBuilder.Conventions.Add(new RemoveDiacriticsFunctionConvention());
}

Поскольку я сначала использую код, я создал класс для отображения :

public class RemoveDiacriticsFunctionConvention : IStoreModelConvention<EntityContainer>
{
    public void Apply(EntityContainer item, DbModel model)
    {
        //Delare your parameters name, edm type and mode (You can ignore this if you use a parameter-less function)
        List<FunctionParameter> Parameters = new List<FunctionParameter>();
        Parameters.Add(FunctionParameter.Create("StringValue", GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.In));

        //Same thing goes for the return type(s) (Why is it a list? Perhaps you can return tables? I haven't tested however since it is no use to me)
        List<FunctionParameter> ReturnParameters = new List<FunctionParameter>();
        ReturnParameters.Add(FunctionParameter.Create("ReturnValue", GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.ReturnValue));

        //Create the payload and fill the required information alone with the parameter lists we declared
        EdmFunctionPayload payload = new EdmFunctionPayload();
        payload.IsComposable = true;
        payload.Schema = "dbo";
        payload.StoreFunctionName = "RemoveDiacritics";
        payload.ReturnParameters = ReturnParameters;
        payload.Parameters = Parameters;

        //Create the function with it's payload
        EdmFunction function = EdmFunction.Create("RemoveDiacritics", "dbo", DataSpace.SSpace, payload, new MetadataProperty[] { });

        //Add it to the model
        model.StoreModel.AddItem(function);
        model.Compile();
    }

    //Little helper method to get the primitive type based on the database provider
    private EdmType GetStorePrimitiveType(DbModel model, PrimitiveTypeKind typeKind)
    {
        return model
            .ProviderManifest
            .GetStoreType(TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(typeKind)))
            .EdmType;
    }

}

Работает нормально, но с надстройкой происходит сбой!

Когда я добавляю миграцию, я получаю эту ошибку:

add-migration test -verbose
Using StartUp project 'xxx'.
Using NuGet project 'xxx'.

Система Исключение Строковое пространство имен, Boolean ignoreChanges) в System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold (Строковое миграционное имя, Boolean ignoreChanges) в System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffolder в Scaffolder (миграция) .Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore ( ) в System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run () Последовательность не содержит элементов

Ошибка поступает из этой строки:

modelBuilder.Conventions.Add(new RemoveDiacriticsFunctionConvention());

Пока что Я попытался добавить атрибут [nomapped] в класс RemoveDiacriticsFunctionConvention и:

modelBuilder.Ignore<RemoveDiacriticsFunctionConvention>();

Но все равно выдает ту же ошибку!

...