2013-01-09 36 views
12

Tôi gặp sự cố khi nhận phương thức Seed được gọi trên bộ khởi tạo cơ sở dữ liệu tùy chỉnh của mình. Tôi đang sử dụng EF 5.0 và có mã sau:DropCreateDatabaseAlways Seed không được gọi là

public static class MyDatabase 
{ 
    public static void Initialize() 
    { 
     Database.SetInitializer(new MyInitializer()); 
    } 
} 

public class MyInitializer : DropCreateDatabaseAlways<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     base.Seed(context); 
     context.Roles.Add(new Role 
     { 
      ID = 1, 
      Name = "User", 
     }); 
     context.Roles.Add(new Role 
     { 
      ID = 2, 
      Name = "Admin", 
     }); 
     context.SaveChanges(); 
    } 
} 

Hai lớp này tồn tại trong thư viện lớp riêng biệt từ ứng dụng MVC. Trong Global.asax, tôi gọi là Initialize() phương pháp:

MyDatabase.Initialize(); 

Cơ sở dữ liệu được tạo ra chỉ tốt, nó chỉ là phương pháp Seed(MyContext context) không được gọi và không có dữ liệu được đưa vào cơ sở dữ liệu của tôi.

+0

Hết sức tò mò, điều gì sẽ xảy ra nếu bạn đặt cơ sở.Phải vào cuối phương thức? – IronMan84

+0

Điều tương tự, nó không được gọi. Tôi đặt một breakpoint vào bối cảnh.Roles.Add và nó không bao giờ phá vỡ. Nó sẽ có bất cứ điều gì để làm với initializer đang ở trong một thư viện lớp khác nhau và không phải trong dự án web chính nó? Tôi nghĩ tôi đã thực hiện nó theo cách này trước đây, nhưng không thể nhớ cụ thể. –

+0

Có thể. Nó cũng có thể là bạn đã đặt mọi thứ trong một lớp tĩnh. – IronMan84

Trả lời

1

Phương thức Seed sẽ được gọi khi bạn gửi truy vấn SQL đầu tiên đến cơ sở dữ liệu của mình, chứ không phải trong Application_Start. Ví dụ:

using (var ctx = new MyContext()) 
{ 
    var rolesCount = ctx.Roles.Count(); // should return 2 
} 
+0

Tôi đang gửi truy vấn đến cơ sở dữ liệu. Điều này tôi có thể xác nhận bằng cách sử dụng Intellitrace. Trong bố cục, tôi đang điền một danh sách thả xuống có danh sách dữ liệu luôn trống rỗng. Tôi cũng đang cố gắng lưu người dùng vào vai trò không tồn tại. –

13

cơ sở dữ liệu của bạn sẽ được tạo ra sau khi bạn sử dụng ngữ cảnh của bạn hoặc Bạn luôn có thể buộc nó để tạo ra bằng cách sử dụng ngữ cảnh của bạn trong phương thức Application_Start() trong Global.asax.cs như:

System.Data.Entity.Database.SetInitializer(new MyInitializer()); 
MyContext db = new MyContext(); 
db.Database.Initialize(true); 
+0

Tôi chưa có cơ hội để thử điều này, nhưng khi tôi làm, tôi sẽ cho bạn biết làm thế nào nó đi. Cám ơn vì sự gợi ý! –

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