私はasp.net mvc 4でプログラミングしており、インターネットアプリケーションテンプレートを選択するとデフォルトで作成されるテンプレートを使用しているため、これにはModelsフォルダーの下にAccountModels.csというモデルが付属しており、次のように初期化されます(AccountModels.cs):
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
(...) // tables definition
ただし、デフォルトで作成された同じデータベースにアプリ構成を保存するいくつかのテーブルを追加する必要はありませんが、AccountModels.cs で作成されたデフォルト ファイル内に構成テーブルを作成したくありません。それらがアプリに関連していることを知るためにそれらを分離したい構成なので、Models フォルダーの下に AppConfigModels.cs という別のファイルを作成しました。このファイルには、これ (その一部) が含まれています。
public class ConfigContext : DbContext
{
public ConfigContext()
: base("DefaultConnection")
{
}
public DbSet<Config1> Config1{ get; set; }
public DbSet<Config2> Config2{ get; set; }
}
(...) // tables definition
これはデフォルトの名前空間と同じ名前空間にあり、アプリ構成テーブルを同じデータベースに作成したいので、同じデータベースを指すようにします。
デフォルトでは、エンティティ フレームワークは作成された場合にデータベースを更新しないため、既存のデータベースの名前を変更するか削除して、エンティティ フレームワークが再度作成されるようにします (モデルが変更された場合にエンティティ フレームワークがデータベースを更新するように動作を変更できることはわかっていますが、この場合は先に進みました説明したとおり)。そのため、InitializeSimpleMembershipAttribute.cs ファイルの OnActionExecuting を開始してフォローします。
[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); <---- HERE IT CRASHES
}
(...)
}
そして、発生したエラーは次のとおりです。
The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588
これを取り除く方法は?テーブルを別のファイルに分けておき、別のコンテキストで同じデータベースを指すようにしたいと考えています。