Cơ sở dữ liệu được tạo thành công (giống như các bảng) nhưng không được tạo hạt giống. Tôi đã dành nhiều giờ và đọc rất nhiều bài viết nhưng không thể có được nó. Bất kỳ đề xuất?Làm thế nào tôi có thể lấy cơ sở dữ liệu của mình để tạo hạt giống bằng cách sử dụng Entity Framework CodeFirst?
Trên một lưu ý phụ, có thể gọi trình khởi tạo mà không cần tham chiếu đến DatabaseContext của tôi trong ứng dụng khách không?
Tôi đã bao gồm tất cả mã có liên quan mà tôi có thể nghĩ đến. Nếu bất cứ điều gì khác sẽ hữu ích, xin vui lòng cho tôi biết.
Những điều tôi đã thử:
- Tôi đã xóa chuỗi kết nối của tôi (vì nó mặc định là SQLEXPRESS anyways, chỉ tên đã thay đổi)
- tôi đã thay đổi DropCreateDatabaseIfModelChanges để DropCreateDatabaseAlways, vẫn như nhau.
Chỉnh sửa: Điều thực sự kỳ lạ là nó đã hoạt động một lần, nhưng tôi không biết làm thế nào hoặc tại sao nó lại phá vỡ. Tôi giả định các chuỗi kết nối, nhưng ai biết được.
DatabaseInitializer.cs
public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
{
protected override void Seed(DatabaseContext context)
{
// Seeding data here
context.SaveChanges();
}
}
DatabaseContext.cs
public class DatabaseContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder mb)
{
// Random mapping code
}
public DbSet<Entity1> Entities1 { get; set; }
public DbSet<Entity2> Entities2 { get; set; }
}
Global.asax.cs - Application_Start()
protected void Application_Start()
{
Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Khách hàng web.config
<connectionStrings>
<add name="DatabaseContext" connectionString="data source=.\SQLEXPRESS;Database=Database;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
GIẢI PHÁP
Vì lợi ích của tài liệu, tôi đang chia sẻ giải pháp của mình ở đây. Điều hướng tất cả các bình luận sẽ là một nỗi đau. Cuối cùng tôi đã có DatabaseInitializer và DatabaseContext trong các lớp riêng biệt. Tôi không thực sự hiểu trong khi những thay đổi nhỏ bé này đã sửa nó, nhưng ở đây.
DatabaseInitializer.cs
public class DatabaseInitializer : CreateDatabaseIfNotExists<DatabaseContext>
{
protected override void Seed(DatabaseContext context)
{
// Seed code here
}
}
DatabaseContext.cs
public class DatabaseContext : DbContext
{
public DatabaseContext() : base("MyDatabase") { }
protected override void OnModelCreating(DbModelBuilder mb)
{
// Code here
}
public DbSet<Entity> Entities { get; set; }
// Other DbSets
}
Global.asax.cs - Application_Start()
protected void Application_Start()
{
Database.SetInitializer(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Bạn có thêm các mục hạt giống với bối cảnh dữ liệu của bạn? Tôi biết tôi đã bỏ lỡ điều đó trước đây. –
Vâng tôi. Cảm ơn bạn đã kiểm tra mặc dù :). – OpticalDelusion
= D Không phải lo lắng. Bạn có thể đặt một điểm break trong mã và đảm bảo rằng Seed của bạn đang được gọi? –