Nhiều khung cảnh DB trong cùng một DB và ứng dụng trong EF 6 và Mã di chuyển đầu tiên


94

Tôi mới sử dụng Entity Framework. Tôi đang cố gắng thiết lập một Ứng dụng MVC sử dụng EF 6. Tôi đang sử dụng Code First Migrations. Tôi đang sử dụng Khu vực trong ứng dụng và muốn có các DbContexts khác nhau trong mỗi khu vực để chia nhỏ nó. Tôi biết EF 6 có ContextKey, nhưng tôi không thể tìm thấy thông tin đầy đủ về cách sử dụng nó. Hiện tại, tôi chỉ có thể sử dụng di chuyển một ngữ cảnh tại một thời điểm.

Ai đó có thể cho một ví dụ với đủ chi tiết để một người mới với EF như tôi hiểu và sử dụng.

Câu trả lời:


176

Entity Framework 6 đã thêm hỗ trợ cho nhiều DbContexts bằng cách thêm -ContextTypeName-MigrationsDirectorycờ. Tôi vừa chạy các lệnh trong Bảng điều khiển Trình quản lý Gói của mình và dán đầu ra bên dưới ...

Nếu bạn có 2 DbContextgiây trong dự án của mình và bạn chạy enable-migrations, bạn sẽ gặp lỗi (như bạn có thể đã biết):

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.

Vì vậy, bạn phải chạy enable-migrationstrên từng loại DbContextriêng biệt. Và bạn phải chỉ định một thư mục cho mỗi Configuration.cstệp sẽ được tạo ...

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.

Để thêm di chuyển cho từng loại DbContext, bạn thực hiện như thế này bằng cách chỉ định tên đủ điều kiện của Configurationlớp:

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.

Và bạn chạy update-databasetheo cùng một cách:

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.

Hi vọng điêu nay co ich.


Tôi có phải có một chuỗi kết nối riêng cho từng ngữ cảnh hay có cách nào giải quyết được điều đó không?
Lrayh

3
Họ có thể chia sẻ cùng một chuỗi kết nối. Nhưng bạn muốn đảm bảo rằng chúng không ánh xạ vào các bảng giống nhau.
Anthony Chu

Nếu chúng ánh xạ đến cùng một bảng, bạn vẫn có thể xác định quá trình di chuyển nào sẽ chạy trước và để tệp di chuyển của nó tạo bảng và tệp nào sẽ chạy thứ hai, và sửa đổi nó để không tạo bảng đã thoát. Sau đó, bạn có thể sử dụng MigrateDatabaseToLatestVersiongiả mạo ctx.Database.initialize()của từng ngữ cảnh để chạy theo đúng thứ tự hoặc chạy Update-Databaselệnh bằng tay theo đúng thứ tự. (Và ngược lại, nếu bạn thực hiện chuyển db sang phiên bản trước). Nó "nguy hiểm" nhưng có thể làm được.
JotaBe

Vì vậy, tôi đã thêm di chuyển vào dự án của mình và tạo một ngữ cảnh khác với ApplicationDbContext. Tôi đã tiếp tục sử dụng bối cảnh đó là dữ liệu liên quan đến trang web trong khoảng 6 tháng, sau đó đã đến lúc bắt đầu gây rối với ApplicationUser của tôi. Đăng nhập và đăng ký cơ bản của tôi đã hoạt động, nhưng tôi muốn mở rộng lớp người dùng để thêm một số trường bổ sung. Câu trả lời này rất hữu ích trong việc thiết lập cấu hình di chuyển mới cho ngữ cảnh đó. Cảm ơn bạn! # 1up
Eric Bishard 17/02/15

1
Nếu tôi có thể cho bạn điểm +10 cho câu trả lời ngắn gọn nhưng quá đủ này, tôi sẽ cảm ơn, Cảm ơn @AnthonyChu.
Karim AG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.