我正在研究一个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())
个实体应该初始化后但我最终得到了这个错误
错误讯息:
由于先前的功能评估,功能评估被禁用 时间到。您必须继续执行以重新启用功能 评价。
最初,我认为这是我服务器的连接问题,所以我查了一下:
虽然我很难理解为什么它们是导致这个问题的原因,因为我采用了几种方法来测试我的ConnectionString,发现它没有问题。
任何帮助肯定会受到赞赏。 提前谢谢。
Thang Do
P / S:这是我测试连接字符串的方式: 这是我的连接字符串 我用它测试了它
答案 0 :(得分:2)
确保您使用的初始化策略与您尝试实现的策略相匹配。 Database.SetInitializer<T>(...);
通过在App_Start
方法中使用以下行,我相信您可能会绕过初始化
Database.SetInitializer<SpaceUpEntities>(null);
以下是article代码优先数据库初始化策略的一些选项,希望对您有所帮助:
有四种不同的数据库初始化策略:
CreateDatabaseIfNotExists :这是默认初始值设定项。顾名思义,如果根据配置不存在,它将创建数据库。但是,如果更改模型类,然后使用此初始化程序运行应用程序,则会引发异常。
DropCreateDatabaseIfModelChanges :如果您的模型类(实体类)已更改,则此初始化程序将删除现有数据库并创建新数据库。因此,当模型类发生更改时,您不必担心维护数据库模式。
DropCreateDatabaseAlways :顾名思义,无论您的模型类是否已更改,此初始化程序每次运行应用程序时都会删除现有数据库。当您在开发应用程序时每次运行应用程序时需要新数据库时,这将非常有用。
自定义数据库初始化程序:您还可以创建自己的自定义初始值设定项,如果上述任何一个不满足您的要求,或者您想要执行其他一些使用初始化数据库的过程初始化程序