مهاجرت چندین مستاجر با Entity Framework 6.0 در مدل Code First
یکشنبه 5 مرداد 1393مهاجرت چندین مستاجر با 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،خصوصیت های زیادی دارد.که مهاجرت چندین مستاجر یکی از آنهاست.
من امیدوارم این مقاله به شما کمک کرده باشد.
- ASP.net MVC
- 3k بازدید
- 8 تشکر