2012-11-09 33 views
12

Phương thức My Seed() của tôi không bao giờ được gọi. Nó được gọi khi tôi làm một số Update-Database từ Bảng điều khiển Trình quản lý Gói, nhưng không bao giờ khi tôi chạy từ mã. Nếu tôi xóa cơ sở dữ liệu của mình, tất cả các bảng được tạo (vì vậy các lớp di chuyển của tôi được thực hiện), nhưng mã Seed() của tôi không bao giờ được gọi. MVC 4, Khung thực thể hoạt động 5 mã đầu tiên.Phương thức My Seed() không bao giờ được gọi trong Code First EF 5

Global.asax:

protected void Application_Start() 
{ 
    Database.SetInitializer<MyContext>(new DbInitializer()); 
} 

DBInit:

internal class DbInitializer : MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration> 
{ 
} 

DBContext:

public partial class MyContext : DbContext 
{ 
    public MyContext() : base("DefaultConnection") 
    { 
    } 
    // public DBSets.... 
} 

Cấu hình:

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
public Configuration() 
{ 
    // The constructor is actually called 
    AutomaticMigrationsEnabled = false; 
} 

protected override void Seed(MyContext context) 
{ 
    // My seed code, never called 
} 

Điều gì có thể sai?

+2

Bạn có chắc chắn rằng bạn đang làm điều gì đó với ngữ cảnh không? DbContext là lười biếng; nó không làm được gì nhiều cho đến khi bạn bắt đầu sử dụng nó bằng cách, ví dụ, chạy một truy vấn hoặc thêm một đối tượng. Trình khởi tạo của bạn sẽ chỉ chạy khi ngữ cảnh được sử dụng lần đầu tiên. Bạn có thể gây ra khởi tạo xảy ra bằng cách gọi context.Database.Initialize (false); –

+0

Tôi có cùng một vấn đề, mặc dù tôi không có cấu hình khá giống nhau (tôi dựa vào trải nghiệm ngoài hộp) .Tôi đã thử chạy context.database.Khởi tạo (false) với cả true và false nhưng không phải chúng đều gây ra phương thức seed. – Noel

+0

@ArthurVickers Vâng, tôi chắc chắn. –

Trả lời

15

Vì vậy, lý do là tôi cần phải xác định tùy chỉnh Initializer của tôi trong tập tin cấu hình:

<entityFramework> 
     <contexts> 
     <context type="EFTest2.MyContext, EFTest2"> 
      <databaseInitializer type="EFTest2.Initializers.DbInitializer, EFTest2" /> 
     </context> 
     </contexts> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 

Sau đó, phương pháp Seed tôi được gọi.

+0

cảm ơn người đàn ông đã giúp –

+0

Database.SetInitializer (mới MigrateDatabaseToLatestVersion ()); /* trong hàm tạo ngữ cảnh của bạn cũng hoạt động */ –

5

Trước tiên hãy tham khảo câu trả lời được chấp nhận.
Tôi chỉ muốn thêm một lưu ý rất quan trọng cho vấn đề này.

Tôi đang đối mặt với CHÍNH XÁC cùng một vấn đề được mô tả bằng câu hỏi này (và điều này dẫn tôi đến đây). NHƯNG Tôi đã sử dụng CreateDatabaseIfNotExists thay vì MigrateDatabaseToLatestVersion và phương pháp hạt giống của tôi không được thực thi ngay cả sau khi áp dụng câu trả lời được chấp nhận.

Vấn đề của tôi là như sau: Theo documentation of the for the Seed method: phương pháp Seed của DbMigrationsConfiguration sẽ không được thực hiện nếu cơ sở dữ liệu Initializer là một trong những điều sau đây

Nếu bạn đang sử dụng một trong các loại đó, bạn nên tạo lớp của riêng bạn mà kế thừa từ một trong các loại đó và sau đó ghi đè phương thức hạt giống trong lớp của riêng bạn.

Trong trường hợp của tôi, việc thêm lớp sau giải quyết được sự cố.

public class CreateNotifierDatabaseIfNotExists : CreateDatabaseIfNotExists<NotifierContext> 
{ 
    protected override void Seed(NotifierContext context) 
    { 
     // the code of the seeding is go here 
    } 
} 
+0

Đây là những gì tôi không hiểu: Khi nào bạn không sử dụng một trong các lớp này? Tôi đã làm theo một ví dụ trong một cuốn sách đã phát biểu bằng cách sử dụng 'DropCreateDatabaseIfModelChanges' đã tạo cơ sở dữ liệu của tôi, và sau đó thay đổi nó thành một' NullDatabaseInitializer' và 'DbMigrationsConfiguration' để tạo hạt giống. Tất cả đều làm việc tốt đẹp về kết thúc của tôi nhưng bây giờ tôi đang tìm ra cơ sở dữ liệu không được tạo ra cho các nhà phát triển khác. Vì vậy, tôi đã thay đổi nó thành 'CreateDatabaseIfNotExists' và bây giờ nó tạo ra, nhưng không hạt giống. Vì vậy, 'DbMigrationsConfiguration' chỉ dùng để chống lại một db không được tạo bởi EF? – xr280xr

Các vấn đề liên quan