Я использую функцию 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>();
Но все равно выдает ту же ошибку!