C# 将添加迁移与EDM函数一起使用时出错
我正在使用edm功能:C# 将添加迁移与EDM函数一起使用时出错,c#,asp.net,ef-code-first,mapping,C#,Asp.net,Ef Code First,Mapping,我正在使用edm功能: [DbFunction("dbo", "RemoveDiacritics")] public static string RemoveDiacritics(string param) { throw new NotSupportedException("Direct calls are not supported."); } 我在ApplicationDBContextClass上添加了以下内容: protected override void OnModelC
[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;
}
}
System.InvalidOperationException:序列不包含任何元素
at System.Linq.Enumerable.Single[TSource](IEnumerable1源)
位于System.Data.Entity.Utilities.XDocumentExtensions.GetStorageMappingItemCollection(XDocument
型号,DbProviderInfo和providerInfo)
位于System.Data.Entity.Migrations.Infrastructure.EdmModelDifference.Diff(XDocument
sourceModel,XDocument targetModel,惰性
1
modificationCommandTreeGenerator、MigrationSqlGenerator
migrationSqlGenerator,字符串sourceModelVersion,字符串
targetModelVersion)
位于System.Data.Entity.Migrations.DbMigrator.Scaffold(字符串migrationName、字符串命名空间、布尔值ignoreChanges)
位于System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(字符串
migrationName,布尔值(更改)
位于System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(迁移文件夹
架子工)
在System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore()中
位于System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()处
序列不包含任何元素
错误来自以下行:
modelBuilder.Conventions.Add(new RemoveDiacriticsFunctionConvention());
到目前为止,我尝试在RemoveDiacriticsFunctionConvention类上添加[nomapped]属性,并:
modelBuilder.Ignore<RemoveDiacriticsFunctionConvention>();
modelBuilder.Ignore();
但它仍然给我同样的错误
modelBuilder.Ignore<RemoveDiacriticsFunctionConvention>();