[C#.NET][Entity Framework] Code-First Initial Database

[C#.NET][Entity Framework] Code-First Initial Database

在 Code First 預設有三種初始化的類別

CreateDatabaseIfNotExists

IDatabaseInitializer 的實作,只會在資料庫不存在時重新建立資料庫,並選擇性地重新植入資料庫。 若要植入資料庫,請建立衍生類別並覆寫 Seed 方法。

DropCreateDatabaseIfModelChanges

IDatabaseInitializer 的實作,它只會在模型(POCO)於資料庫建立後已變更時刪除及重新建立資料庫,並選擇性地重新植入資料庫。

DropCreateDatabaseAlways

IDatabaseInitializer 的實作,只要是初次在應用程式定義域中使用內容,就一定會重新建立資料庫,並選擇性地重新植入資料庫。 若要植入資料庫,請建立衍生類別並覆寫 Seed 方法。

 

這些類別都不會幫我們加入資料,初始化資料庫並加入資料時我們必須要實作上面那些類別或是實作 IDatabaseInitializer ,然後在 Seed 方法將資料加上去


{
    protected override void Seed(ThreeLayerDbContext context)
    {
        base.Seed(context);

        Account account1 = new Account() { UserId = "yao1", Password = "1234" };
        Account account2 = new Account() { UserId = "yao2", Password = RandomPassword() };
        Account account3 = new Account() { UserId = "yao3", Password = RandomPassword() };
        Account account4 = new Account() { UserId = "yao4", Password = RandomPassword() };

        context.Accounts.Add(account1);
        context.Accounts.Add(account2);
        context.Accounts.Add(account3);
        context.Accounts.Add(account4);

        context.AccountLogs.AddRange(RandomAccountLog(account1, 6));
        context.AccountLogs.AddRange(RandomAccountLog(account2, 5));
        context.AccountLogs.AddRange(RandomAccountLog(account3, 2));
        context.AccountLogs.AddRange(RandomAccountLog(account4, 4));
        context.SaveChanges();
    }
}

 

 

調用時,在DbContext 實體化前調用 Database.SetInitializer 方法



public BusinessFlowDao()
{
    Database.SetInitializer(new DbInitializer());

    if (this._db == null)
    {
        this._db = new ThreeLayerDbContext();
        //this._db.Database.Initialize(true);
    }
}

 

 

若上面這些初始化的行為不是你要的,當然可以自行實作 IDatabaseInitializer ,實作時會用到大量的 Database 類別,


{
    public void InitializeDatabase(ThreeLayerDbContext context)
    {
        if (context.Database.Exists())
        {
            if (!context.Database.CompatibleWithModel(true))
            {
                context.Database.Delete();
            }
        }
        //TODO 資料庫初始化處理...
        context.Database.Create();
        context.Database.ExecuteSqlCommand("CREATE TABLE GLOBAL_DATA([KEY] VARCHAR(50), [VALUE] VARCHAR(250))");
    }
}

 


本文出自:http://www.dotblogs.com.tw/yc421206/archive/2014/12/11/147610.aspx

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo