在SQL Server 2008上建立实体框架代码优先数据库



我成功地使用SQL Server CE创建了我的第一个实体框架代码项目。数据库表自动创建,一切正常。

然后我将连接字符串更改为指向我创建的SQL Server数据库,并期望它自动生成表。它没有这样做,而是抱怨表不存在。

经过一番阅读,我发现我需要为我的App_Start方法添加一个初始化器。

我试着:

// Method 1
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EFContext>());

但这一开始并没有工作,因为它无法找到EdmMetaData表来发现模型是否发生了变化。

所以我试着添加:

// Method 2
Database.SetInitializer(new CreateDatabaseIfNotExists<EFContext>());

但是这不起作用,因为我已经创建了数据库,当我删除数据库时,它仍然不起作用,因为我登录的用户没有创建数据库的权限。

我终于试了:

// Method 3
Database.SetInitializer(new DropCreateDatabaseAlways<EFContext>());

这是有效的,但我真的不想每次都放弃db。因此,一旦它运行并添加了EdmMetaData表,我就用方法1替换它,现在工作得很好。

虽然这个方法是有效的,但它并不像我使用SQL Server CE时那样优雅,我也没有发现有人建议你使用这个方法。

那么,我错过了什么,有没有更简单,更优雅的方法来做到这一点?

方法1和方法2期望数据库还不存在。如果您手动创建数据库,它们将不起作用。如果您需要EF在现有数据库中创建表,您必须创建自定义数据库初始化器

最新更新