2012-05-04 11 views
1

私は再利用するためのモジュールを作成しようとしています。たとえば、ユーザー操作(ログイン、登録など)を作成および処理し、ビルドし、他のプロジェクト内でDLLを使用するメンバーシッププロジェクトです。.net mvc codefirst複数のSiteDataContextInitializerデータベース

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を使用して、メインプロジェクトで使用、メイン:私は、独自の名前空間を使用して、私のPOCOクラスとのDataContextを作成してメンバーシッププロジェクトでそう

、このプロジェクトは、独自の名前空間、の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)が作成され、メインプロジェクトのdatacontextに定義されているデータが生成されますが、作成されませんメンバーシップのためのPOCOまたはシード。メンバーシップデータを使用するページにアクセスすると、メンバーシップのみのデータベースが再作成されます。

メンバーシップ(およびその他のモジュール)をメインプロジェクトと共に使用するには、メインプロジェクトにテーブル、リレーションシップ、およびシーディングを手動で追加する必要はありません。

たとえば、主なプロジェクトはショッピングカートについてです。メンバーシップモジュールを使用するには、ShoppingCart DataContext内のすべてのPOCOクラスをコピーする必要があります。また、ユーザー、ロールなどを作成するためにシード部分もコピーする必要があります。メンバーシップ内でイニシャライザ、どのようにカプセル化するので、すべてのモジュールからメインアプリケーションにコードをコピーする必要はなく、すべてのテーブルとデータを持つデータベースを持つだけですか?

答えて

0

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

あなたのweb.configにSiteDataContextという接続文字列を定義しましたが、明示的にCloudOne.Membership.Models.SiteDataContextという接続文字列を定義していないとは限りません。

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

私はこれをEF 4.1で試していませんが、モデル変更のトラッキングによって2つのコンテキストが同じ物理データベース(as described here)を共有することはできません。

簡単に言えば、直面する問題は、メンバーシップコンテキストを接続文字列で初期化していないため、ローカルにデフォルト設定されていることです。 EFはアクティブなApp Domain(あなたのショッピングカートのWebサイト)のコンテキストの名前を持つ接続文字列を探して、そのサイトのweb.configに存在する必要があります。

+0

お返事ありがとうございます。はい、私はあなたに同意します、問題は解決レベルですべての接続のための単一の文字列を宣言する方法を見つけることができないので、今はそれがProjectレベルであるので、あなたが言うように、 – Nestor

+0

ソリューションがMVCまたはASP.NET Webアプリケーションの周りにある場合は、適切な接続文字列をWeb.configに配置するだけです。接続文字列の名前は重要です。これはDbContext名と一致する必要があり、名前空間で修飾する必要があります。ソリューションがコンソールアプリケーションまたはデスクトップアプリケーションの場合は、App.configと同じですが、それ以外は同じです。これがあなたの質問に答えるなら、あなたの解決策としてこの答えをチェックしてください。 – kingdango

関連する問題