私は再利用するためのモジュールを作成しようとしています。たとえば、ユーザー操作(ログイン、登録など)を作成および処理し、ビルドし、他のプロジェクト内で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クラスをコピーする必要があります。また、ユーザー、ロールなどを作成するためにシード部分もコピーする必要があります。メンバーシップ内でイニシャライザ、どのようにカプセル化するので、すべてのモジュールからメインアプリケーションにコードをコピーする必要はなく、すべてのテーブルとデータを持つデータベースを持つだけですか?
お返事ありがとうございます。はい、私はあなたに同意します、問題は解決レベルですべての接続のための単一の文字列を宣言する方法を見つけることができないので、今はそれがProjectレベルであるので、あなたが言うように、 – Nestor
ソリューションがMVCまたはASP.NET Webアプリケーションの周りにある場合は、適切な接続文字列をWeb.configに配置するだけです。接続文字列の名前は重要です。これはDbContext名と一致する必要があり、名前空間で修飾する必要があります。ソリューションがコンソールアプリケーションまたはデスクトップアプリケーションの場合は、App.configと同じですが、それ以外は同じです。これがあなたの質問に答えるなら、あなたの解決策としてこの答えをチェックしてください。 – kingdango