EF Code First 未初始化数据库
Posted
技术标签:
【中文标题】EF Code First 未初始化数据库【英文标题】:EF Code First not initializing database 【发布时间】:2013-02-08 14:24:00 【问题描述】:我有一个 EF Code First DbContext、一个用于播种数据的自定义初始化程序,以及一个在 Global.asax 的 Application_Start 部分设置初始化程序的引导静态类。
初始化器看起来像:
public class DropCreateDatabaseWithSeedData : DropCreateDatabaseAlways<MyEntities>
protected override void Seed(MyEntities context)
context.Genders.Add(new Gender Id = 1, Name = "Male", SortOrder = 1 );
context.Genders.Add(new Gender Id = 2, Name = "Female", SortOrder = 2 );
context.Genders.Add(new Gender Id = 3, Name = "Prefer not to say", SortOrder = 3 );
引导静态类如下所示:
public static class Bootstrap
public static void InitialiseDataAccessLayer()
Database.SetInitializer(new DropCreateDatabaseWithSeedData());
var uow = new UnitOfWork();
uow.Context.Database.Initialize(force: true);
Global.asax Application_Start 看起来像:
protected void Application_Start()
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
DataAccess.Infrastructure.Bootstrap.InitialiseDataAccessLayer();
一切看起来都应该如此,但是没有发生数据库初始化 - 如果我在没有预先存在的数据库的情况下运行应用程序,我会得到一个 SqlClient 异常:
A System.Data.SqlClient.SqlException was thrown: "Cannot open database MyEntities requested by the login. The login failed. Login failed for user 'localdev'."
用户 localdev 拥有对 SQL Server 的完全访问权限,我可以使用 SSMS 登录到该 SQL Server 并创建、删除、更新等数据库。
如果我使用现有但为空的数据库运行应用程序,应用程序会尝试运行它可以运行的第一个查询(在这种情况下,一些用户验证查询)并在尝试查询表时因“无效对象”异常而失败不存在的。
如果我在没有现有数据库的情况下运行 uow.Context.Database.Create(),则确实创建了数据库,但没有插入任何种子数据。
如果我将初始化程序更改为 DropCreateDatabaseAlways,则不会发生初始化。
以上所有代码行都遇到断点,因此不会立即跳过任何内容 - 唯一未命中的断点是初始化程序中的种子方法,因此甚至没有被调用(这不是如果初始化没有发生,那就太令人惊讶了!)。
在这一点上,我没有想法 - 一切都按照它应该的方式设置,但没有进行数据库初始化。
【问题讨论】:
【参考方案1】:哞,
尽管对InitialiseDataAccessLayer()
的调用看起来正确,而对Database.SetInitializer(new DropCreateDatabaseWithSeedData());
的调用看起来是正确的,但尝试从ApplicationStart
直接调用Database.SetInitializer(new DropCreateDatabaseWithSeedData());
。
它不会实例化您的UnitOfWork
,但由于您正在播种,我不确定您此时是否需要这样做。
如果没有别的,那就是另一个想法。
【讨论】:
以上是关于EF Code First 未初始化数据库的主要内容,如果未能解决你的问题,请参考以下文章
ef4.4 code first数据库新增时 初始化表数据不成功