Monday, January 11, 2016

Entity Framework 6 Veri Tabanı Fonksiyonu Haritalama (Önce Kod Örüntüsü) - Entity Framework 6 Database Function Mapping (Code First Pattern)

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();
     }
}





No comments:

Post a Comment