首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实体框架Database.SetInitializer根本无法正常工作应该怎么解决?

实体框架Database.SetInitializer根本无法正常工作应该怎么解决?
EN

Stack Overflow用户
提问于 2018-04-25 06:44:14
回答 2查看 0关注 0票数 0

目前在ASP.NET MVC 3应用程序中使用Entity Framework 4.1 Code First方法,Database.SetInitializer停止工作

我有这个简单的模型

代码语言:javascript
复制
public class User
{
    public int Id { get; set; }
    public int RoleId { get; set; }

    [Required]
    [StringLength(50)]
    [DataType(DataType.Text)]
    public string Login { get; set; }

    [Required]
    [StringLength(150)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime RegisteredDate { get; set; }

    public virtual Role Role { get; set; }
}

这是我的DbContext

代码语言:javascript
复制
public class MyContext : DbContext
{
    public DbSet<Models.User> Users { get; set; }
}

此外,我设置自定义初始值(测试)

代码语言:javascript
复制
public class MyInitializer 
            : DropCreateDatabaseIfModelChanges<MyContext>
{
}

现在我已经在Web.config中设置了连接字符串(名称与MyContext相同)因此,在Global.asax中,我在Application_Start()方法中调用此简单代码

代码语言:javascript
复制
Database.SetInitializer(new MyInitializer());

但问题是Database.SetInitializer WONT创建任何数据库,甚至更糟糕的是,它甚至不试图填充现有的数据库与上下文的表,我试图调试,但应用程序只是跳过数据库初始化代码。

我找到了一个解决方案,就是使用这一行代码

代码语言:javascript
复制
var ctx = new MyContext();
ctx.Database.Initialize(true);

在这里我强制代码来创建数据库

我查看了Windows事件日志,sql服务器日志,但没有任何内容。

PS我正在使用Visual Web Developer 2010 + SQL Server Express 2008 R2

EN

回答 2

Stack Overflow用户

发布于 2018-04-25 15:40:37

只有在实际使用上下文时才会创建数据库。

如果已在初始化程序中覆盖了Seed方法,如下所示:

代码语言:javascript
复制
protected override void Seed(MyContext context){...}

Seed代码只会在使用MyContext的实例时运行。

这就是为什么它在你使用时的作用

代码语言:javascript
复制
var ctx = new MyContext();
ctx.Database.Initialize(true);

可以通过在Global.asax.cs中的Application_Start()方法中使用上下文来强制它创建,如:

代码语言:javascript
复制
        System.Data.Entity.Database.SetInitializer(new MyInitializer());

        MyContext db = new MyContext();
        db.Database.Initialize(true);
        //or even something like db.Users.Count();

或者稍后在使用上下文时创建它。它可能看起来像停止工作,因为你删除了一些在应用程序启动时会使用上下文的代码。

票数 0
EN

Stack Overflow用户

发布于 2018-04-25 16:35:04

另一种创建数据库的方法

代码语言:javascript
复制
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

var context = new MyContext();
context.Database.Create();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档