MVC3数据库实体未按预期初始化

时间:2014-11-25 16:28:51

标签: c# asp.net-mvc entity-framework asp.net-mvc-3

经过仔细研究解决我遇到的这个奇怪问题后,我没有做任何事情。我非常绝望。

我正在研究一个MVC3项目。

我有一个像这样的DB Context类:

//SpaceUpEntities.cs
public class SpaceUpEntities: DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Profile> Profiles { get; set; }
    public DbSet<Venue> Venues { get; set; }
    public DbSet<Room> Rooms { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Event> Events { get; set; }
    public DbSet<Capacity> Capacities { get; set; }
    public DbSet<VenueStatus> VenueStatuses { get; set; } 
}

我在应用程序启动时初始化DBContext

//Global.asax.cs
 protected void Application_Start()
 {
        Database.SetInitializer<SpaceUpEntities>(null);  
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
        RegisterDependencyInjection();
        ModelBinders.Binders.DefaultBinder = new TrimModelBinder();
 }

当我想查询/插入/更新数据库时,会出现问题。 例如这段代码

 //SecurityRepository.cs 
    public RegisterFeedback Register(User user, Profile profile)
    {
        try
        {
            using (var entities = new SpaceUpEntities())
            {  
                // Check existing email address
                var emailExisted = entities.Users.FirstOrDefault(i => i.Email == user.Email);
                //... So on 
            }
        }
        catch (Exception e)
        {
            Logger.Error(e);
            return new RegisterFeedback(false, Messages.GeneralError);
        }
    }

using (var entities = new SpaceUpEntities())个实体应该初始化后但我最终得到了这个错误

Error

错误讯息:

  

由于先前的功能评估,功能评估被禁用   时间到。您必须继续执行以重新启用功能   评价。

最初,我认为这是我服务器的连接问题,所以我查了一下:

  1. 的ConnectionString
  2. SQL Server设置(SQL Server 2012)
  3. 虽然我很难理解为什么它们是导致这个问题的原因,因为我采用了几种方法来测试我的ConnectionString,发现它没有问题。

    任何帮助肯定会受到赞赏。 提前谢谢。

    Thang Do

    P / S:这是我测试连接字符串的方式: 这是我的连接字符串                      我用它测试了它 ConnectionTest.udl

1 个答案:

答案 0 :(得分:2)

确保您使用的初始化策略与您尝试实现的策略相匹配。 Database.SetInitializer<T>(...);

通过在App_Start方法中使用以下行,我相信您可能会绕过初始化

Database.SetInitializer<SpaceUpEntities>(null);

以下是article代码优先数据库初始化策略的一些选项,希望对您有所帮助:


有四种不同的数据库初始化策略:

  1. CreateDatabaseIfNotExists :这是默认初始值设定项。顾名思义,如果根据配置不存在,它将创建数据库。但是,如果更改模型类,然后使用此初始化程序运行应用程序,则会引发异常。

  2. DropCreateDatabaseIfModelChanges :如果您的模型类(实体类)已更改,则此初始化程序将删除现有数据库并创建新数据库。因此,当模型类发生更改时,您不必担心维护数据库模式。

  3. DropCreateDatabaseAlways :顾名思义,无论您的模型类是否已更改,此初始化程序每次运行应用程序时都会删除现有数据库。当您在开发应用程序时每次运行应用程序时需要新数据库时,这将非常有用。

  4. 自定义数据库初始化程序:您还可以创建自己的自定义初始值设定项,如果上述任何一个不满足您的要求,或者您想要执行其他一些使用初始化数据库的过程初始化程序