21

İlk önce Entity Framework 5.0 Kodunu kullanan bir MVC4 web uygulamasına sahibim.Varlık Çerçevesi ve Üyelik tabloları ile veritabanı nasıl başlatılır

Global.asax.cs dosyasında Entity.Database'i başlatan bir önyükleyicim var, veritabanını başlatmaya zorlayın ve Üyelik için veritabanını başlatın.

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

Çünkü:

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"}) 

    } 
} 

Sorun ile üyelik Kullanıcıyı oluşturamazsınız şudur: DatabaseContextInitializer an için çok basit

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

: Kod bu biridir Veritabanının oluşturulmadığı bir problemim var. Entity Framework 5.0 ve Asp.Net MVC 4 ile veritabanınız için bazı varsayılan kullanıcıları nasıl başlatırsınız?

cevap

33

Veritabanınızı geçişleri kullanarak almak için önerilen yaklaşım için following article'a bakın.

  1. paket yöneticisi konsol tipinde aşağıdaki komutu İnternet Template
  2. kullanarak yeni ASP.NET MVC 4 uygulaması oluşturun:

    enable-migrations 
    
  3. İşte

    adımlardır Bu, veritabanınızı ekleyebileceğiniz bir ~/Migrations/Configuration.cs dosyası oluşturacaktır:

    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. web.config memebership ve rol sağlayıcılarını belirtin:

    <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. çalıştırın paket yöneticisi konsolunda göç:

    update-database -verbose 
    
+0

Merhaba, bu çözümü yapabilir yarı yol Aslında veritabanı ilk kez oluşturulduğu için tablo-veritabanı değil, iki kez güncelleme-veritabanını çalıştırmak zorundayım. Oturum açma tarafından talep edilen "Veritabanı açamıyor" WorkoutPlannerDb "hatası var. Oturum açma işlemi başarısız oldu." Bunun nedeni, InitializeDatabaseConnection ilkini kullanmak yerine yeni bir bağlantıyı yeniden açmasıdır. –

+2

AutomaticMigrationsEnabled = true; kullanmak çok korkutucu. Kodunuzu ilk DbContext'inizi değiştirdiğinizde ve üretim ortamında asla kullanılmaması gerektiğinde otomatik olarak veritabanını geçirir. Geri dönüş için herhangi bir geçiş adımınız olmadığından DB'deki değişiklikleri bozmak oldukça zordur. Bunun yerine, kod ilk DB modelindeki her değişiklik için geçiş adımlarını açıkça eklemek için "eklenti taşıma" özelliğini kullanın. – angularsen

+3

@Darin: Daha eski bir soru sorduğum için üzgünüm, ancak EF içeriğini web projenizden ayırırsanız bu yine de geçerli olur mu? WebMatrix. * Ve System.Web.Security'i bir veri düzeyinde bulunmaması gereken bağımlılıklar yarattığını düşünebiliyorum ... (Belki bunun için bir soru sormalıyım?) –