再利用するモジュールを作成しようとしています。たとえば、ユーザー操作 (ログイン、登録など) を作成して処理し、それをビルドして、他のプロジェクト内で 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 クラスと、ユーザー、ロールなどを作成するためのシード部分もコピーする必要があります。しかし、そのコードは既にメンバーシップ内にあります。初期化子、それをカプセル化する方法で、すべてのテーブルとデータを含むデータベースを取得するためだけに、すべてのモジュールからメインアプリにコードをコピーする必要がないようにしますか?