13

Utilizzo di Code First Entity Framework con .NET MVC 4 Ho creato una nuova applicazione Web e popolato il database con l'oggetto come mostrato di seguito..net MVC Autenticazione semplice con database

public class GratifyGamingContext : DbContext 
{ 
    public DbSet<Game> Games { get; set; } 
    public DbSet<Genre> Genres { get; set; } 
    public DbSet<UserProfile> UserRepository { get; set; } 
} 

voglio usare il mio tavolo UserRepository al posto della classe UserContext integrato da AccountModel.cs per il mio account l'accesso degli utenti dal momento che non posso ottenere che il lavoro con il mio DbContext esistente.

public class UsersContext : DbContext 
{ 
    public UsersContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
} 

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
} 

Il mio programma si blocca sempre quando si costruisce un oggetto SimpleMembershipInitializer da InitializeSimpleMembershipAttribute.cs. Ho commentato il codice che ritengo dovrebbe essere irrilevante.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute 
{ 
    private static SimpleMembershipInitializer _initializer; 
    private static object _initializerLock = new object(); 
    private static bool _isInitialized; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Ensure ASP.NET Simple Membership is initialized only once per app start 
     LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
    } 

    private class SimpleMembershipInitializer 
    { 
     public SimpleMembershipInitializer() 
     { 
      //Database.SetInitializer<UsersContext>(null); 

      try 
      { 
       using (var context = new GratifyGamingContext()) 
       { 
        if (!context.Database.Exists()) 
        { 
         // Create the SimpleMembership database without Entity Framework migration schema 
         ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); 
        } 
       } 

       WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
      } 
      catch (Exception ex) 
      { 
       throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); 
      } 
     } 
    } 
} 

mio ConnectionString è la seguente:

<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-GratifyGaming-20120917185558;AttachDbFilename=|DataDirectory|\Games.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> 

ottengo il seguente errore quando si chiama il WebSecurity.InitializeDatabaseConnect qualsiasi AccountController:

[SqlException (0x80131904): ricerca Directory per il file "C: \ Users \ Unreal \ Documents \ Visual Studio 2010 \ Projects \ GratifyGaming \ GratifyGaming.WebUI \ App_Data \ Games.mdf" non riuscito con l'errore del sistema operativo 2 (impossibile recuperare il testo per questo errore. Motivo: 15105). Non è possibile allegare il file 'C: \ Users \ Documenti \ Unreal \ Visual Studio 2010 \ Projects \ GratifyGaming \ GratifyGaming.WebUI \ App_Data \ Games.mdf' come database 'aspnet-GratifyGaming-20.120.917,185558 millions']

. [TargetInvocationException: eccezione è stata generata dalla destinazione di un'invocazione.] System.RuntimeTypeHandle.CreateInstance (RuntimeType tipo, booleano publicOnly, booleano nOCHECK, booleano & canBeCached, RuntimeMethodHandleInternal & ctor, booleano & bNeedSecurityCheck) +0

La mia applicazione è altrimenti connessa al database se non si accede a nessuna pagina guidata di AccountController. Come posso configurare questa applicazione per utilizzare la mia tabella UserRepository al posto di UsersContext per l'appartenenza utente?

risposta

25

Rimuovere l'AttachDBFileName dal DefaultConnectionString nel web.config

<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-GratifyGaming-20120917185558;Integrated Security=True" providerName="System.Data.SqlClient" /> 

chiamate il metodo WebSecurity.InitialiseDatabase in Global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 
     Database.SetInitializer<GratifyGamingContext>(new DatabaseInitializer()); 
     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 

     WebSecurity.InitializeDatabaseConnection(
        connectionStringName: "DefaultConnection", 
        userTableName: "UserProfile", 
        userIdColumn: "UserID", 
        userNameColumn: "UserName", 
        autoCreateTables: true); 
    } 
} 

come commento [InitializeSimpleMembership] in AccountController.cs

[Authorize] 
    //[InitializeSimpleMembership] 
    public class AccountController : Controller 
+0

Trovato questo dopo aver letto un paio di messaggi StackOverflow che c overed diverse componenti del problema. – TryCatch

+4

Quindi non abbiamo più bisogno di 'InitializeSimpleMembershipAttribute'? – Ashkan

+0

Ecco un'altra risposta a questa domanda che potrebbe aiutare alcune persone: http://stackoverflow.com/a/12461447/188246 (leggermente diversa dalla risposta precedente) –

Problemi correlati