21

Tôi có ứng dụng web MVC4 sử dụng Mã khung thực thể 5.0 trước tiên.Cách khởi tạo cơ sở dữ liệu với Khung thực thể và bảng thành viên

Trong Global.asax.cs Tôi có bootstrapper khởi tạo Entity.Database, buộc cơ sở dữ liệu được khởi tạo và khởi tạo cơ sở dữ liệu cho tư cách thành viên. Mã này là một trong những điều này:

System.Data.Entity.Database.SetInitializer(new DatabaseContextInitializer()); 
Database.Initialize(true); 
WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

các DatabaseContextInitializer là rất đơn giản cho thời điểm này:

public class DatabaseContextInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext> 
{ 
    protected override void Seed(DatabaseContext dbContext) 
    { 
     base.Seed(dbContext); 
     db.Set<Workout>().Add(new Workout {Id = 1, Name = "My First workout user1"}) 

    } 
} 

Vấn đề là tôi không thể tạo tài khoản cho thành viên với:

WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

Vì Tôi có một vấn đề với cơ sở dữ liệu không được tạo ra. Làm thế nào để bạn khởi tạo một số người dùng mặc định cho cơ sở dữ liệu của bạn với Entity Framework 5.0 và Asp.Net MVC 4?

Trả lời

33

Hãy xem following article để biết cách tiếp cận được đề xuất để tạo cơ sở dữ liệu của bạn bằng cách sử dụng di chuyển.

Sau đây là các bước sau:

  1. Tạo một ASP.NET MVC 4 ứng dụng mới sử dụng Template Internet
  2. Trong gói quản lý giao diện điều khiển kiểu của bạn vào lệnh sau:

    enable-migrations 
    
  3. Thao tác này sẽ tạo một tệp ~/Migrations/Configuration.cs mà bạn có thể thêm vào cơ sở dữ liệu của mình:

    using System.Data.Entity.Migrations; 
    using System.Linq; 
    using System.Web.Security; 
    using WebMatrix.WebData; 
    
    internal sealed class Configuration : DbMigrationsConfiguration<MvcApplication1.Models.UsersContext> 
    { 
        public Configuration() 
        { 
         AutomaticMigrationsEnabled = true; 
        } 
    
        protected override void Seed(MvcApplication1.Models.UsersContext context) 
        { 
         WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
    
         if (!Roles.RoleExists("Administrator")) 
         { 
          Roles.CreateRole("Administrator"); 
         } 
    
         if (!WebSecurity.UserExists("john")) 
         { 
          WebSecurity.CreateUserAndAccount("john", "secret"); 
         } 
    
         if (!Roles.GetRolesForUser("john").Contains("Administrator")) 
         { 
          Roles.AddUsersToRoles(new[] { "john" }, new[] { "Administrator" }); 
         } 
        } 
    } 
    
  4. Xác định memebership và các nhà cung cấp vai trò trong web.config của bạn:

    <roleManager enabled="true" defaultProvider="SimpleRoleProvider"> 
        <providers> 
        <clear/> 
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> 
        </providers> 
    </roleManager> 
    <membership defaultProvider="SimpleMembershipProvider"> 
        <providers> 
        <clear/> 
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> 
        </providers> 
    </membership> 
    
  5. Run sự di cư trong quản lý giao diện điều khiển gói của bạn:

    update-database -verbose 
    
+0

Xin chào, tôi có thể làm cho giải pháp này một nửa. Tôi có trong thực tế để chạy cập nhật cơ sở dữ liệu hai lần vì lần đầu tiên cơ sở dữ liệu được tạo ra nhưng không phải bảng. Tôi có lỗi "Không thể mở cơ sở dữ liệu" WorkoutPlannerDb "yêu cầu đăng nhập. Đăng nhập thất bại." Tôi đoán đó là vì InitializeDatabaseConnection mở lại một kết nối mới thay vì sử dụng kết nối đầu tiên? –

+2

AutomaticMigrationsEnabled = true; rất đáng sợ để sử dụng. Nó tự động di chuyển cơ sở dữ liệu bất cứ khi nào bạn thay đổi mã DbContext đầu tiên và không bao giờ được sử dụng trong môi trường sản xuất. Nó là vô cùng khó khăn để phục hồi từ phá vỡ những thay đổi trong DB, vì bạn không có bước di chuyển để theo dõi trở lại từ. Thay vào đó, hãy sử dụng "thêm di chuyển" để thêm rõ ràng các bước di chuyển cho mỗi thay đổi đối với mô hình DB đầu tiên mã. – angularsen

+3

@Darin: Xin lỗi để đưa ra một câu hỏi cũ hơn, nhưng điều này vẫn sẽ áp dụng nếu bạn tách ra bối cảnh EF từ dự án web của bạn? Tôi không thể tưởng tượng bạn muốn tham chiếu đến WebMatrix. * Và System.Web.Security như đã tạo ra các phụ thuộc không nên tồn tại ở mức dữ liệu ... (Có lẽ tôi nên đặt câu hỏi cho điều này?) –

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