EF代码的自定义初始化策略首先不删除表以添加列

Ser*_*eit 5 entity-framework ef-code-first entity-framework-4.1

最新的EF Code First NuGet包附带了一个IDatabaseInitializer被调用的自定义实现DontDropDbJustCreateTablesIfModelChanged.顾名思义,当检测到模型更改时,它不会丢弃并重新创建整个数据库,只需删除并重新创建表.

说我有这个模型类:

public class User
{
    public string Username { get; set; }

    // This property is new; the model has changed!
    public string OpenID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一个如何去实现一个IDatabaseInitializer不降大任于表无论是.在这种情况下,它只会OpenID向User表添加一列?

Lad*_*nka 5

我认为这是SQL的问题.因此,对于SQL Server,您可以编写如下内容:

public class MyInitializer : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        context.Database.SqlCommand(
            @"
            IF NOT EXISTS (SELECT 1 FROM sys.columns AS col
                           INNER JOIN sys.tables AS tab ON tab.object_Id = col.object_Id
                           WHERE tab.Name = 'User' AND col.Name = 'OpenId')
            BEGIN
                ALTER TABLE dbo.User ADD OpenId INT; 
            END");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是以同样的方式你可以执行这样的脚本而不将它添加到你的应用程序,我认为这是更好的方法.