1

私は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

これを取り除く方法は?テーブルを別のファイルに分けておき、別のコンテキストで同じデータベースを指すようにしたいと考えています。

4

3 に答える 3

4

Entity Framework チームの Arthur Vickers は、次のパターンを推奨しています。

複数のコンテキストに対して app.config ファイルで個別の接続文字列を指定する代わりに、1 つの文字列を設定して、一般的な名前を付けます。

<connectionStrings>
    <add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" />
</connectionStrings>

次に、接続文字列を使用する基本コンテキスト クラスを作成します。

using System.Data.Entity; 

    namespace DataLayer
    {
        public class BaseContext<TContext> : DbContext where TContext : DbContext
        {
            static BaseContext()
            {
                Database.SetInitializer<TContext>(null); 
            }
            protected BaseContext()
                : base("name=MyDBContext")
            {
            }

        }
    }

次に、各コンテキストでこの基本動作を継承します (たとえば):

namespace DataLayer.Models
{
    public class OrderContext : BaseContext<OrderContext>

…

namespace DataLayer.Models
{
    public class ProductContext : BaseContext<ProductContext>
…
于 2013-11-26T11:57:32.700 に答える