Entity Framework 6 (EF) ile beraber yeni genel "Conventions" özelliği ile artık "Code First" örüntüsü kullanarak EF meta bilgisine müdahele edilebilmektedir. Aşağıdaki örnekte Oracle içinde yer alan TO_CHAR ve TO_NUMBER fonksiyonları haritalanmıştır.
public class FunctionConvention : IStoreModelConvention
{
public void Apply(EdmModel item, DbModel model)
{
AddToCharFunc(model);
AddToNumberFunc(model);
}
public void AddToCharFunc(DbModel dbModel)
{
var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String);
var payload =
new EdmFunctionPayload
{
Schema = "SYS.STANDARD",
ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion,
IsComposable = true,
IsNiladic = false,
IsBuiltIn = true,
IsAggregate = false,
IsFromProviderManifest = true,
StoreFunctionName = "TO_CHAR",
ReturnParameters =
new[]
{
FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue)
},
Parameters =
new[]
{
FunctionParameter.Create("Val", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32), ParameterMode.In)
}
};
var function = EdmFunction.Create("TO_CHAR", "EntityLayer.Utility", DataSpace.SSpace, payload, null);
dbModel.StoreModel.AddItem(function);
}
public void AddToNumberFunc(DbModel dbModel)
{
var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Decimal);
var payload =
new EdmFunctionPayload
{
Schema = "SYS.STANDARD",
ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion,
IsComposable = true,
IsNiladic = false,
IsBuiltIn = true,
IsAggregate = false,
IsFromProviderManifest = true,
StoreFunctionName = "TO_NUMBER",
ReturnParameters =
new[]
{
FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue)
},
Parameters =
new[]
{
FunctionParameter.Create("Val", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), ParameterMode.In)
}
};
var function = EdmFunction.Create("TO_NUMBER", "EntityLayer.Utility", DataSpace.SSpace, payload, null);
dbModel.StoreModel.AddItem(function);
}
}
FunctionConvention sınıfı ilgili fonksiyonların haritalanması için gerekli meta bilgilerin oluşturulmasını sağlayan bir Convention sınıf oluşturulduktan sonra Context sınıfı içinde yer alan "OnModelCreating" fonksiyonu içinde tanımlanmaktadır.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new FunctionConvention());
}
Yukarıdaki işlemler yapıldıktan sonra LINQ sorgularında kullanılabilmesi için aşağıdaki gibi bir sınıf içinde ilgili fonksiyonların karşılıkları tanımlanmalıdır:
public class CommonFunctions
{
[DbFunction("EntityLayer.Utility", "TO_CHAR")]
public static string TO_CHAR(int Val)
{
throw new NotSupportedException();
}
[DbFunction("EntityLayer.Utility", "TO_NUMBER")]
public static decimal TO_NUMBER(string Val)
{
throw new NotSupportedException();
}
}