1

再利用するモジュールを作成しようとしています。たとえば、ユーザー操作 (ログイン、登録など) を作成して処理し、それをビルドして、他のプロジェクト内で dll を使用するメンバーシップ プロジェクトです。

したがって、メンバーシップ プロジェクトでは、独自の名前空間を使用して POCO クラスと DataContext を作成します。

namespace CloudOne.Membership.Models
{
    public class SiteDataContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<UserRole> UserRoles { get; set; }
        public DbSet<UserRoleJoin> UserRoleJoins { get; set; }

        // Twist our database
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }
    }

    public class SiteDataContextInitializer : DropCreateDatabaseAlways<SiteDataContext>
    {
        protected override void Seed(SiteDataContext context)
        {
            // users

            var user = new User { UserID = "UserA", Password = "D33177D41FD48F0027BD10D2689E8599", DateCreated=DateTime.Now, DateLastLogin = DateTime.Now };

            context.Users.Add(user);

            var roles = new List<UserRole>
            {
                new UserRole { RoleID = "Admin" },
                new UserRole { RoleID = "Editor" },
                new UserRole { RoleID = "Customer" },
                new UserRole { RoleID = "Guest" }
            };

            roles.ForEach(m => context.UserRoles.Add(m));

            var userRoleJoin = new UserRoleJoin { UserID = "UserA", RoleID = "Admin" };

            context.UserRoleJoins.Add(userRoleJoin);
        }
    }
}

次に、CloudOne.Membership.dll を参照としてメイン プロジェクトで使用します。メイン プロジェクトには独自の名前空間、DataContext、およびシードがあります。

namespace CloudOne.Models
{
    public class SiteDataContext : DbContext
    {
        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<ProductPrice> ProductPrices { get; set; }
        public DbSet<ProductPicture> ProductPictures { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }
    }

    public class SiteDataContextInitializer : DropCreateDatabaseAlways<SiteDataContext>
    {
        protected override void Seed(SiteDataContext context)
        {
            // data seeding here

            context.SaveChanges();
        }
    }
}

次に、global.asax から両方の初期化子を呼び出します

protected void Application_Start()
        {
            Database.SetInitializer<SiteDataContext>(new SiteDataContextInitializer());
            Database.SetInitializer<CloudOne.Membership.Models.SiteDataContext>(new CloudOne.Membership.Models.SiteDataContextInitializer());

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

問題は、メイン プロジェクト クラスを使用するページにアクセスすると、メイン クラスで定義された POCO のデータベース (ModelFirst) が作成され、メイン プロジェクトのデータ コンテキストで定義されているデータがシードされますが、POCO またはシードは作成されません。メンバーシップのもの。また、Membership データを使用するページにアクセスすると、Membership 専用のデータベースが再作成されます。

では、テーブル、リレーションシップ、およびシードをすべて手動で追加することなく、メイン プロジェクトと一緒にメンバーシップ (およびその他のモジュール) を使用するにはどうすればよいでしょうか?

たとえば、メイン プロジェクトはショッピング カートに関するもので、メンバーシップ モジュールを使用するには、ShoppingCart DataContext 内のすべての POCO クラスと、ユーザー、ロールなどを作成するためのシード部分もコピーする必要があります。しかし、そのコードは既にメンバーシップ内にあります。初期化子、それをカプセル化する方法で、すべてのテーブルとデータを含むデータベースを取得するためだけに、すべてのモジュールからメインアプリにコードをコピーする必要がないようにしますか?

4

1 に答える 1

0

これは接続文字列の問題である可能性が高く、DBは実際には、期待した場所ではなく作成されています。

私の推測では、web.configで接続文字列を定義しましたが、接続文字列を明示的にSiteDataContext定義していません。CloudOne.Membership.Models.SiteDataContext

EFは、これら2つの別々のDbContextを検討します。クラスを同じ名前にするだけでそれらをマージできるわけではありません。したがって、割り当てている個別の初期化命令に沿った個別の接続文字列を探しています。

私はEF4.1でこれを試していませんが、モデル変更の追跡により、2つのコンテキストが同じ物理データベースを共有するのを防ぐことができると思います(ここで説明します)。

つまり、当面の問題は、メンバーシップコンテキストを接続文字列で初期化していないため、デフォルトでローカルになっていることだと思います。EFは、アクティブなアプリドメイン(ショッピングカートのWebサイト)でコンテキストの名前を持つ接続文字列を見つけようとするため、そのサイトのweb.configにある必要があります。

于 2012-06-18T12:42:05.693 に答える