15

Tôi đã gặp khó khăn trong việc giải quyết vấn đề này kể từ 4.1 (hiện tại tôi đang ở trạng thái 4.3). Dường như với tôi rằng để có được phương pháp hạt gọi là, tất cả những gì cần phải làm là như sau:phương pháp hạt giống không được gọi với EntityFramework CodeFirst

1) Tạo một danh mục dữ liệu trống trên SQLServer 2) Thực hiện các mã bên dưới:

Database.SetInitializer(new DropCreateDatabaseAlways<SiteDB>()); 

Tôi có SiteDB của tôi được định nghĩa như sau:

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
      ... (break point set here that never gets hit) 

Tôi cảm thấy thiếu cái gì đó rất đơn giản vì điều này tạo ra các bảng của tôi, nhưng không bao giờ gọi phương thức hạt giống.

Để làm cho điều này rõ ràng hơn, dưới đây là ví dụ đầy đủ bao gồm tất cả mã. Khi tôi chạy nó, hạt giống không bao giờ được gọi là:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using System.Data.Entity; 

namespace ConApp 
{ 
internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Database.SetInitializer(new SiteDBInitializer()); 
     using (var db = new SiteDB()) 
     { 
      var x = db.Customers; 
     } 
    } 
} 

public class SiteDB : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    public string LastName { get; set; } 
} 

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
     db.Customers.Add(new Customer() {LastName = "Kellner"}); 
     db.Customers.Add(new Customer() {LastName = "Jones"}); 
     db.Customers.Add(new Customer() {LastName = "Smith"}); 
     db.SaveChanges(); 
    } 
} 

} 

Trả lời

8

Bạn cần gọi Database.SetInitializer(new SiteDBInitializer()); thay thế.

+1

Tôi giả sử bạn có nghĩa là: Database.SetInitializer (new SiteDBInitializer()); Tôi đã thử điều đó và nó cũng không hoạt động. –

+1

@PeterKellner Nó được gọi khi bạn làm điều gì đó (ví dụ: Truy vấn) lần đầu tiên. Bạn đã thử thực hiện một truy vấn? – Eranga

+0

Hi Eranga và J.W. Tôi đã cập nhật câu hỏi của mình để bao gồm một ứng dụng giao diện điều khiển tầm thường mà tôi tin rằng hạt giống nên được gọi và nó không. Nếu bạn có thể có một cái nhìn (và thậm chí dán nó vào và chạy nó), tôi thực sự đánh giá cao nó. Tôi chắc chắn có một cái gì đó đơn giản tôi đang mất tích nhưng nó đã được lái xe được điên trong nhiều tháng. –

0

Tôi đã xem tất cả các câu trả lời cho điều đó, không có gì thực sự hiệu quả và tôi tự hỏi liệu đó có phải là lỗi của Microsoft vì không gọi phương thức Seed khi DB không tồn tại. Mã duy nhất mà làm việc, là để thực sự làm cho các lớp gọi là hạt giống nếu DB không tồn tại: lớp

Bối cảnh:

class AlisDbContext : DbContext 
{ 
    public class MyContextFactory : IDbContextFactory<AlisDbContext> 
    { 
     public AlisDbContext Create() 
     { 
      return new AlisDbContext("CompactDBContext"); 
     } 
    } 

    public AlisDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
     Database.SetInitializer(new AlisDbInitializer(this)); 
     Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AlisDbContext>()); 
    } 

    public DbSet<SavedCredentials> SavedCredentialses { get; set; } 
} 

Sau đó AlisDbInitializer cần phải kiểm tra và gọi phương thức hạt giống như:

public AlisDbInitializer(AlisDbContext alisDbContext) 
    { 
     if (!alisDbContext.Database.Exists()) 
     { 
      Seed(alisDbContext); 
     }   
    } 
Các vấn đề liên quan