ورود / ثبت نام
0
0

تنظیم entity framework برای پشتیبانی از انواع بانک اطلاعاتی

460 بازدید
بانک اطلاعاتی

بانک اطلاعاتی

بانک اطلاعاتی در اکثر نرم افزارها نقش مهمی را ایفا میکند .در گذشته نرم افزارها برای اتصال به بانک اطلاعاتی محدودیت های زیادی را داشتند و فقط میتوانستند به یک بانک اطلاعاتی مشخصی متصل شوند .امروزه نرم افزارها می توانند بر روی پلت فرم های مختلفی اجرا شوند ولی به طور عموم باز هم با یک بانک اطلاعاتی سر و کار داریم .برای پشتیبانی از چند بانک اطلاعاتی باید در برنامه خود تغییراتی را انجام دهیم .

بانک اطلاعاتی

در ابتدا به مشکلاتی که بانک های مختلف با یکدیگر دارند را اشاره میکنیم :

. جداول موجود در SQL و ستونهای موجود case sensitive ( حساس به حروف بزرگ و کوچک هستند)

. بانک اطلاعاتی Oracle به صورت معمول همه جداول را Upper Case ایجاد میکند .

. PostgreSQL به صورت پیش فرض جداول را Lower Case ایجاد میکند .

در برنامه نویسی شئئ گرایی در c# به طور عموم از Pascal Case استفاده میکنیم .پس اگر بخواهیم یک نرم افزار را به تعدادی از بانک اطلاعاتی متصل کنیم با مشکل مواجه میشویم .

متدهای مختلفی برای ایجاد نرم افزاری که از چند بانک اطلاعاتی پشتیبانی کند وجود دارد ، ما در این مقاله به یکی از ساده ترین روش ها اشاره کرده ایم .

گام اول :

در ابتدا باید یک جدول با دو ستون (id,TestCol) ایجاد میکنیم .

MS SQL :

بانک اطلاعاتی

Oracle :

بانک اطلاعاتی

Postgre SQL :

بانک اطلاعاتی

حالا باید موارد زیر را در Nuget Packages نصب کنیم :

بانک اطلاعاتی

EntityFramework

Oracle.ManagedDataAccess

Oracle.ManagedDataAccess.EntityFramework

Npgsql

EntityFramework6.Npgsql

بانک Oracle به صورت خودکار تغییرات لازم را انجام می دهد .ولی در PostgreSQL ممکن است با مشکلی مواجه شوید ، از این رو می توانید در قسمت confige کدهای خود را با کدهای زیر مقایسه نمایید :

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>

<DbProviderFactories>
  <remove invariant="Oracle.ManagedDataAccess.Client" />
  <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <remove invariant="Npgsql" />
  <add name="Npgsql - .Net Data Provider for PostgreSQL" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>

برای اتصال به بانک نیز به Connection String احتیاج است :

<connectionStrings>
  <add name="TestConnectionString" connectionString="Data Source=.\SQL2014;Initial Catalog=TestDb;Integrated Security=True;" providerName="System.Data.SqlClient" />
  <!--<add name="TestConnectionString" connectionString="DATA SOURCE=127.0.0.1:1521/XE;PASSWORD=1234;PERSIST SECURITY INFO=True;USER ID=TEST_USER" providerName="Oracle.ManagedDataAccess.Client" />-->
  <!--<add name="TestConnectionString" connectionString="Server=127.0.0.1;Database=test_db;UserId=test_user;Password=1234;" providerName="Npgsql" />-->
</connectionStrings>

حالا باید entity برای جداول خود را ایجاد نماییم :

[DbTable(msSqlName: "Table1", oracleName: "TABLE1", postgreSqlName: "table1")]
class Table1
{
    [DbColumn(msSqlName: "Id", oracleName: "ID", postgreSqlName: "id")]
    [Key]
    public int Id { get; set; }

    [DbColumn(msSqlName: "TestCol", oracleName: "TEST_COL", postgreSqlName: "test_col")]
    [Required]
    public string TestCol { get; set; }
}

همانطور که در کد بالا مشاهده می نمایید ما دو خاصیت تعریف کردیم : DbTable و DbColumn این دو خاصیت مهمترین بخش تنظیمات هستند که باید کلاس مربوط به هر کدام را ایجاد کنیم .

ابتدا با DbColumn شروع می کنیم :

class DbColumnAttribute : ColumnAttribute
{
    public DbColumnAttribute(string msSqlName, string oracleName, string postgreSqlName)
        : base(Tools.DbProvider == DbProviders.MsSql
            ? msSqlName
            : Tools.DbProvider == DbProviders.Oracle
                ? oracleName
                : Tools.DbProvider == DbProviders.PostgreSql
                    ? postgreSqlName
                    : null) {}
}

همانطور که مشاهده میکنید کلاس پایه ColumnAttribute میباشد .در هنگام فراخوانی متد base() نام بانک اطلاعاتی که در Connecion String تعریف کرده ایم را باید قرار دهیم .

class DbTableAttribute : TableAttribute
{
    public DbTableAttribute(string msSqlName, string oracleName, string postgreSqlName, string msSqlSchema = null, string oracleSchema = null, string postgreSqlSchema = null)
        : base(Tools.DbProvider == DbProviders.MsSql
            ? msSqlName
            : Tools.DbProvider == DbProviders.Oracle
                ? oracleName
                : Tools.DbProvider == DbProviders.PostgreSql
                    ? postgreSqlName
                    : null)
    {
        switch (Tools.DbProvider)
        {
            case DbProviders.MsSql:
                Schema = (msSqlSchema ?? ConfigurationManager.AppSettings["DefaultDbSchema"]) ?? "dbo";
                break;
            case DbProviders.Oracle:
                Schema = (oracleSchema ?? ConfigurationManager.AppSettings["DefaultDbSchema"]);
                break;
            case DbProviders.PostgreSql:
                Schema = (postgreSqlSchema ?? ConfigurationManager.AppSettings["DefaultDbSchema"]);
                break;
        }
    }
}

به طور معمول در نرم افزارها ما فقط یک نمودار (schema)از بانک اطلاعاتی داریم .اما اگر بخواهیم چند نمودار مربوط به بانک های مختلف را داشته باشیم بهتر است که با نام اختصاری آنها را در Config ذخیره کنیم .

class TestDataContext : DbContext
{
    public TestDataContext() : base("name=TestConnectionString")
    {
        // Disable auto migrations
        Database.SetInitializer<TestDataContext>(null);

        Configuration.AutoDetectChangesEnabled = true;
        Configuration.LazyLoadingEnabled = true;
        Configuration.ProxyCreationEnabled = true;
    }

    public virtual DbSet<Table1> Table1 { get; set; }
}

اگر برنامه را تست کنیم باید نرم افزار در هر سه بانک به خوبی و بدون هیچ مشکلی مانند تصاویر زیر اجرا شود .

Ms SQL :

<appSettings>
  <add key="DefaultDbSchema" value="dbo" />
</appSettings>

<connectionStrings>
  <add name="TestConnectionString" connectionString="Data Source=.\SQL2014;Initial Catalog=TestDb;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

بانک اطلاعاتی

oracle :

<appSettings>
  <add key="DefaultDbSchema" value="TEST_USER" />
</appSettings>

<connectionStrings>
  <add name="TestConnectionString" connectionString="DATA SOURCE=127.0.0.1:1521/XE;PASSWORD=1234;PERSIST SECURITY INFO=True;USER ID=TEST_USER" providerName="Oracle.ManagedDataAccess.Client" />
</connectionStrings>

بانک اطلاعاتی

Postgre SQL :

<appSettings>
  <add key="DefaultDbSchema" value="public" />
</appSettings>

<connectionStrings>
  <add name="TestConnectionString" connectionString="Server=127.0.0.1;Database=test_db;UserId=test_user;Password=1234;" providerName="Npgsql" />
</connectionStrings>

بانک اطلاعاتی

موفق باشید !

آیا این مطلب را می پسندید؟
https://www.mspsoft.com/?p=17284
اشتراک گذاری:
واتساپتوییترفیسبوکپینترستلینکدین
داریوش فرخی
داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .
مطالب بیشتر
برچسب ها:

نظرات

0 نظر در مورد تنظیم entity framework برای پشتیبانی از انواع بانک اطلاعاتی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

هیچ دیدگاهی نوشته نشده است.