مهاجرت چندین مستاجر با Entity Framework 6.0 در مدل Code First

یکشنبه 5 مرداد 1393

مهاجرت چندین مستاجر با Entity Framework 6.0 در مدل Code First

مهاجرت چندین مستاجر با Entity Framework 6.0 در مدل Code First

تا زمان Entity Framework5،مهاجرت به صورت تکی که تنها یک بستر از در هر پایگاه داده فیزیکی را مدیریت می کرد، وجود داشت.

هم اکنون ،Entity Framework6، از چندین مدل های مهاجرت در هر پایگاه داده فیزیکی ،پشتیبانی می کند.

این ویژگی EntityFramework، به عنوان "Multi-Tenant Migrations" یا" Multiple Contexts per Database"  شناخته می شود.

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

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

مهاجرت مدل Entity Framework Code First ، به ما اجازه می دهد که یک پایگاه داده جدید را بسازیم و یک پایگاه داده را بروزرسانی کنیمو

مهاجرت مدل Entity Framework 5 Code First ، تنها یک بستر برای هر پایگاه داده فیزیکی را پشتیبانی می کند

درصورتیکه مدل Entity Framework 6 Code First، چندین بستر برای هر پایگاه داده فیزیکی را پشتیبانی می کند.

در ذیل رویه مهاجرت یک مدل Code First نمایش داده شده است.

مرحله اول:

توانایی مهاجرت DBContext  با فضای نام   Migrations-Directory-Name

مرحله دوم:

اضافه کردن پیکر بندی مهاجرت

مرحله سوم:

بروزرسانی پایگاه داده

نکته مهم

Connection String ،باید شبیه Connection String  در ADO.Net  باشد و همچنین نام آن بجای “System.Data.EntityClient”  در مدل Database First ، باید “System.Data.SqlClient”  باشد.

    <configuration>  
    …..  
    …..  
    <connectionStrings>  
    <add name="Entities" connectionString="Data Source=serverName;Initial Catalog=DatabaseName;Persist Security Info=True;User ID=sa;Password=password ;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>  
    </connectionStrings>  
    </configuration>  

مثال

فرض بر این است ما دو مدل DBContext  با نام های EmployeeContext و OderContext  در یک پروژه داریم

کدهای کلاس مدل و کلاس DBContect  در زیر آمده است.

Model Classes (Employee context)

    public class DepartmentMaster  
    {  
    [Key]  
    public int DepartmentId { get; set; }  
    public string Code { get; set; }  
    public string Name { get; set; }  
    public List<EmployeeMaster> Employees { get; set; }  
    }  
      
    public class EmployeeMaster  
    {  
    [Key]  
    public int Employee { get; set; }  
    public string Code { get; set; }  
    public string Name { get; set; }  
    public int DepartmentId { get; set; }  
    public DepartmentMaster Department { get; set; }  
    }  

Employee DbContext

    public class EmployeeContext : DbContext  
    {  
    public EmployeeContext()  
    : base("name=Entities")  
    {  
      
    }  
    public DbSet<DepartmentMaster> Departments { get; set; }  
    public DbSet<EmployeeMaster> Employees { get; set; }  
    }  

Model Classes (Order context)

    public class OrderMaster  
    {  
    [Key]  
    public int OrderId { get; set; }  
    public DateTime OrderDate { get; set; }  
    public double TotalAmount { get; set; }  
    public List<OrderDetails> OrderDetails { get; set; }  
    }  
      
    public class OrderDetails  
    {  
    [Key]  
    public int OrderDetailId { get; set; }  
    public int OrderId { get; set; }  
    public string ItemName { get; set; }  
    public int Quantity { get; set; }  
    public string UnitPrice { get; set; }  
    public double Amount { get; set; }  
    public OrderMaster Order { get; set; }  
    }  

Order context

    public class OrderContext : DbContext  
    {  
    public OrderContext()  
    : base("name=Entities")  
    {  
      
    }  
    public DbSet<OrderMaster> Orders { get; set; }  
    public DbSet<OrderDetails> OrderDetails { get; set; }  
    }  

نمایش گرافیکی رابطه ها

رویه مهاجرت Code First

برای مهاجرت، دستورهای زیر باید یکی یکی  در Package Manage Console در VS2012  یا  VS2013 اجرا شوند.

مرحله اول :توانایی مهاجرت برای DBConetext

enable-migrations -ContextTypeName MultipleContextsperDatabase.Model.EmployeeContext -MigrationsDirectory:EmployeeMigrations

خروجی  Package Manage Console

به عنوان نتیجه مرحله اول ،کلاس Configuration  که به فولدر EmployeeMigration  اضافه شده است.

تعریف کلاس  Configuration

    internal sealed class Configuration : DbMigrationsConfiguration<MultipleContextsperDatabase.Model.EmployeeContext>  
    {  
    public Configuration()  
    {  
    AutomaticMigrationsEnabled = false;  
    MigrationsDirectory = @"EmployeeMigrations";  
    }  
      
    protected override void Seed(MultipleContextsperDatabase.Model.EmployeeContext context)  
    {  
      
    }  
    }  

مرحله دوم :اضافه کردن  migration configuration

Add-Migration -configuration MultipleContextsperDatabase.EmployeeMigrations.Configuration InitialEmployee

خروجی Package Manage Console

به عنوان نتیجه مرحله دوم ،فایل مهاجرت Db که در پوشه “EmployeeMigration” تولید شده است.

تعریف فایل مهاجرت

    public partial class InitialEmployee : DbMigration  
    {  
    public override void Up()  
    {  
    CreateTable(  
    "dbo.DepartmentMasters",  
    c => new  
    {  
    DepartmentId = c.Int(nullable: false, identity: true),  
    Code = c.String(),  
    Name = c.String(),  
    })  
    .PrimaryKey(t => t.DepartmentId);  
      
    CreateTable(  
    "dbo.EmployeeMasters",  
    c => new  
    {  
    Employee = c.Int(nullable: false, identity: true),  
    Code = c.String(),  
    Name = c.String(),  
    DepartmentId = c.Int(nullable: false),  
    })  
    .PrimaryKey(t => t.Employee)  
    .ForeignKey("dbo.DepartmentMasters", t => t.DepartmentId, cascadeDelete: true)  
    .Index(t => t.DepartmentId);  
      
    }  
      
    public override void Down()  
    {  
    DropForeignKey("dbo.EmployeeMasters", "DepartmentId", "dbo.DepartmentMasters");  
    DropIndex("dbo.EmployeeMasters", new[] { "DepartmentId" });  
    DropTable("dbo.EmployeeMasters");  
    DropTable("dbo.DepartmentMasters");  
    }  
    }  

مرحله سوم: بروزرسانی پایگاه داده

Update-Database -configuration:MultipleContextsperDatabase.EmployeeMigrations.Configuration -Verbose

خروجی Package Manage Console

 

 بعد از اجرای دستورات بالا ، یک چیز جدید که ساخته خواهد شد ،چیزی است که یک خصوصیت initial catalog مربوط به connectionString  را تولید می کند.

یک جدول با تاریخچه مهاجرت ،جدولی است که تاریخچه مهاجرت را ذخیره می کند.این به ابن معنی است که جدول تاریخچه  مهاجرت شامل تغییرات مهاجرت به پایگاه داده است.

نام پیش فرض این جدول ،_MigrationHistory  است و وقتی که اولین مهاجرت در پایگاه داده اتفاق می افتد ، ساخته میشود.

خروجی جدول  migration history

همین رویه که در بالا توضیح داده شد ،برای  OrderDbContext هم انجام می شود

دستورات زیر ، یکی یکی توسط  Package Manage Console در Vs2012 یا Vs2013  اجرا میشود.

enable-migrations -ContextTypeName:MultipleContextsperDatabase.Model.OrderContext -MigrationsDirectory:OrderMigrations

Add-Migration -configuration MultipleContextsperDatabase.OrderMigrations.Configuration InitialOrder

Update-Database -configuration:MultipleContextsperDatabase.OrderMigrations.Configuration -Verbose

کلاس configuration - تولید شده توسط مرحله اول


    internal sealed class Configuration : DbMigrationsConfiguration<MultipleContextsperDatabase.Model.OrderContext>  
    {  
    public Configuration()  
    {  
    AutomaticMigrationsEnabled = false;  
    MigrationsDirectory = @"OrderMigrations";  
    }  
      
    protected override void Seed(MultipleContextsperDatabase.Model.OrderContext context)  
    {  
      
    }  
    }  

فابل Migration - تولید شده توسط مرحله 2


    public partial class InitialOrder : DbMigration  
    {  
    public override void Up()  
    {  
    CreateTable(  
    "dbo.OrderDetails",  
    c => new  
    {  
    OrderDetailId = c.Int(nullable: false, identity: true),  
    OrderId = c.Int(nullable: false),  
    ItemName = c.String(),  
    Quantity = c.Int(nullable: false),  
    UnitPrice = c.String(),  
    Amount = c.Double(nullable: false),  
    })  
    .PrimaryKey(t => t.OrderDetailId)  
    .ForeignKey("dbo.OrderMasters", t => t.OrderId, cascadeDelete: true)  
    .Index(t => t.OrderId);  
      
    CreateTable(  
    "dbo.OrderMasters",  
    c => new  
    {  
    OrderId = c.Int(nullable: false, identity: true),  
    OrderDate = c.DateTime(nullable: false),  
    TotalAmount = c.Double(nullable: false),  
    })  
    .PrimaryKey(t => t.OrderId);  
      
    }  
      
    public override void Down()  
    {  
    DropForeignKey("dbo.OrderDetails", "OrderId", "dbo.OrderMasters");  
    DropIndex("dbo.OrderDetails", new[] { "OrderId" });  
    DropTable("dbo.OrderMasters");  
    DropTable("dbo.OrderDetails");  
    }  
    }  

جدول تولید شده توسط مرحله 3

خروجی جدول تاریخچه مهاجرت

 

ما همچنین می توانیم با استفاده از دستورات زیر تغییرات پایگاه داده را برگردانیم.

Update-Database -configuration MultipleContextsperDatabase.EmployeeMigrations.Configuration -TargetMigration:"201407221118333_InitialEmployee" –verbose

Update-Database -configuration MultipleContextsperDatabase.OrderMigrations.Configuration -TargetMigration:"201407221128534_InitialOrder" -verbose

خروجی Package Manage Console

Entity Framwork،خصوصیت های زیادی دارد.که مهاجرت چندین مستاجر یکی از آنهاست.

من امیدوارم این مقاله به شما کمک کرده باشد.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید