用戶註冊流程:
DbContext、實體類、EntityTypeConfiguration 映射類public partial class ModelTestContext : DbContext
{
static ModelTestContext()
{
Database.SetInitializer(null); // 禁用默認初始化策略
}
// 核心:接收動態連接字符串
public ModelTestContext(string connectionString) : base(connectionString)
{
// 核心:不存在則自動創建數據庫(含表、約束、索引)
this.Database.CreateIfNotExists();
}
public DbSet Classes { get; set; }
public DbSet Students { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ClassMap());
modelBuilder.Configurations.Add(new StudentMap());
}
}
string connectionString =
"Data Source=.;User=sa;Password=123456;" +
"Initial Catalog=" + db.DbName + // 動態數據庫名:權限系統ID + 學校代碼
";Integrated Security=True";
using (var newDB = new ModelTestContext(connectionString))
{
// 此行執行時:檢查數據庫是否存在 → 不存在則按模型創建所有表、索引、FK
// 無需額外代碼,EF 自動完成 DDL 生成與執行
}
// 示例:權限系統租戶ID + 學校代碼,保證全局唯一
string dbName = "ITOO_" + tenantId + "_" + schoolCode;
// 如:ITOO_1001_BJDX
SSMS 刷新對象瀏覽器,可見新數據庫 ITOO_1001_BJDX 已創建,包含完整表結構、主鍵、外鍵、索引、約束。
dbcreator、目標庫 db_ownerEnable-Migrations,後續模型變更通過 Update-Database 推送到所有租戶庫Seed 方法初始化租戶專屬基礎數據(字典、配置、管理員賬號)SqlException,區分「數據庫已存在」、「權限不足」、「磁盤空間不足」等錯誤碼Pooling=false 或定期清理EF Code First + Database.CreateIfNotExists() 實現了「註冊即建庫」的零代碼 DDL 自動化。**核心在於 DbContext 構造函數注入動態連接串**,配合反向工程生成的精確映射,將「手寫 DDL 腳本」轉為「模型驅動自動遷移」,極大降低多租戶 SaaS 的交付運維成本。