บริบท DB หลายรายการในฐานข้อมูลและแอปพลิเคชันเดียวกันใน EF 6 และ Code First Migrations


95

ฉันเพิ่งเริ่มใช้ Entity Framework ฉันกำลังพยายามตั้งค่าแอปพลิเคชัน MVC ที่ใช้ EF 6 ฉันใช้ Code First Migrations ฉันใช้ Areas ในแอปและต้องการให้ DbContexts แตกต่างกันในแต่ละพื้นที่เพื่อแยกมันออก ฉันรู้ว่า EF 6 มี ContextKey แต่ฉันไม่พบข้อมูลทั้งหมดเกี่ยวกับวิธีใช้ ขณะนี้ฉันสามารถใช้การย้ายข้อมูลได้ทีละบริบทเท่านั้น

ใครช่วยยกตัวอย่างที่มีรายละเอียดเพียงพอให้คนใหม่ EF อย่างฉันเข้าใจและนำไปใช้ได้

คำตอบ:


177

Entity Framework 6 เพิ่มการสนับสนุนสำหรับหลายDbContexts โดยการเพิ่มแฟล็ก-ContextTypeNameและ -MigrationsDirectoryฉันเพิ่งรันคำสั่งในคอนโซล Package Manager ของฉันและวางผลลัพธ์ด้านล่าง ...

หากคุณมี 2 DbContextวินาทีในโปรเจ็กต์ของคุณและคุณเรียกใช้enable-migrationsคุณจะได้รับข้อผิดพลาด (ดังที่คุณอาจทราบแล้ว)

PM> enable-migrations
More than one context type was found in the assembly 'WebApplication3'.
To enable migrations for 'WebApplication3.Models.ApplicationDbContext', use Enable-Migrations -ContextTypeName WebApplication3.Models.ApplicationDbContext.
To enable migrations for 'WebApplication3.Models.AnotherDbContext', use Enable-Migrations -ContextTypeName WebApplication3.Models.AnotherDbContext.

ดังนั้นคุณต้องใช้enable-migrationsในแต่ละDbContextแยก และคุณต้องระบุโฟลเดอร์สำหรับแต่ละConfiguration.csไฟล์ที่จะสร้าง ...

PM> Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

PM> Enable-Migrations -ContextTypeName AnotherDbContext -MigrationsDirectory Migrations\AnotherDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

ในการเพิ่มการย้ายข้อมูลสำหรับแต่ละรายการDbContextคุณทำได้โดยระบุชื่อConfigurationคลาสแบบเต็ม:

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

และคุณวิ่งupdate-databaseในลักษณะเดียวกัน:

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113124_InitialDatabaseCreation].
Applying explicit migration: 201402032113124_InitialDatabaseCreation.
Running Seed method.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113383_InitialDatabaseCreation].
Applying explicit migration: 201402032113383_InitialDatabaseCreation.
Running Seed method.

หวังว่านี่จะช่วยได้


ฉันต้องมีสตริงการเชื่อมต่อแยกต่างหากสำหรับแต่ละบริบทหรือมีวิธีแก้ไขหรือไม่
Lrayh

3
พวกเขาสามารถแบ่งปันสตริงการเชื่อมต่อเดียวกัน แต่คุณต้องแน่ใจว่าพวกเขาไม่ได้จับคู่กับตารางเดียวกัน
Anthony Chu

หากพวกเขาจับคู่กับตารางเดียวกันคุณยังสามารถกำหนดได้ว่าการย้ายข้อมูลใดจะทำงานก่อนและปล่อยให้ไฟล์การย้ายข้อมูลสร้างตารางและไฟล์ใดจะทำงานที่สองและแก้ไขเพื่อไม่ให้สร้างตารางที่ออกไปแล้ว จากนั้นคุณสามารถใช้การMigrateDatabaseToLatestVersionปลอมแปลงctx.Database.initialize()ของแต่ละบริบทเพื่อรันตามลำดับที่ถูกต้องหรือรันUpdate-Databaseคำสั่งด้วยมือตามลำดับที่ถูกต้อง (และย้อนกลับหากคุณทำการย้ายฐานข้อมูลไปยังเวอร์ชันก่อนหน้า) มัน"อันตราย"แต่สามารถทำได้
JotaBe

ดังนั้นฉันจึงได้เพิ่มการโยกย้ายไปยังโครงการของฉันและสร้างบริบทที่แตกต่างจาก ApplicationDbContext ฉันใช้บริบทนั้นซึ่งเป็นข้อมูลที่เกี่ยวข้องกับไซต์เป็นเวลาประมาณ 6 เดือนจากนั้นก็ถึงเวลาเริ่มยุ่งกับ ApplicationUser ของฉัน การเข้าสู่ระบบและการลงทะเบียนขั้นพื้นฐานของฉันใช้งานได้ แต่ฉันต้องการขยายคลาสผู้ใช้เพื่อเพิ่มฟิลด์เพิ่มเติม คำตอบนี้มีประโยชน์มากในการตั้งค่าการกำหนดค่าการย้ายข้อมูลใหม่สำหรับบริบทนั้น ขอขอบคุณ! # 1up
Eric Bishard

1
ถ้าฉันสามารถให้ +10 กับคุณสำหรับคำตอบสั้น ๆ แต่มากเกินพอฉันจะขอบคุณ @AnthonyChu
Karim AG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.