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

Posted

技术标签:

【中文标题】MVC3 数据库实体未按预期初始化【英文标题】:MVC3 Database entities don't get initialized as expected 【发布时间】:2015-01-23 18:15:35 【问题描述】:

在仔细研究了这个奇怪问题的解决方案之后,我什么也没做。我非常绝望。

我正在开发一个 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()) 实体应该已经初始化,但我最终得到了这个错误

错误信息:

函数评估被禁用,因为之前的函数评估 时间到。您必须继续执行才能重新启用功能 评估。

一开始,我以为是我的服务器连接问题,所以我检查了:

    连接字符串 SQL Server 设置 (SQL Server 2012)

虽然我几乎不明白为什么它们是导致此问题的原因,因为我采用了多种方法来测试我的 ConnectionString 以发现它没有问题。

任何帮助都将不胜感激。 提前谢谢你。

唐做

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

【问题讨论】:

您能否确认您的表已在数据库中创建并已植入数据? 表肯定是创建的。数据库中有样本数据。 从您的屏幕截图中不清楚错误是什么,但是通过执行 Database.SetInitializer&lt;SpaceUpEntities&gt;(null); 您正在关闭数据库初始化程序。 工具 -> 选项调试 取消选中“启用属性评估和其他隐式函数调用”然后查看是否有任何错误 @Zaki:取消选中该选项后我仍然收到相同的错误 【参考方案1】:

确保您使用的初始化策略与您要达到的目标相匹配。 Database.SetInitializer&lt;T&gt;(...);

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

Database.SetInitializer<SpaceUpEntities>(null);

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


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

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

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

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

    自定义 DB 初始化程序:如果上述任何一项不能满足您的要求,或者您想要执行其他一些初始化数据库的过程,您也可以创建自己的自定义初始化程序上面的初始化器

【讨论】:

在我有机会对数据库进行任何更改之前,我就遇到了错误。 您在寻找哪种初始化方式?如果您的意思是 DBContext,那么我相信我在 Global.asax.cs 中有它。否则,我不知道,可以使用一些指针 我的意思是你实际上是用行播种数据库还是只是根据 SpaceUpEntities 数据上下文对象创建表?使用 LINQ,您不能总是以您可能期望的方式检查中间对象(如果它们是延迟加载的)。您是否得到了实际的异常抛出,或者您只是在调试时检查对象? 此时我得到异常 'var emailExisted = entity.Users.FirstOrDefault(i => i.Email == user.Email);'然后我调试以查看那些错误消息 我用 SetInitializer 再次尝试了它,这次它可以工作了。我猜上次失败是因为我没有清理+重建项目,也许?我会进行几轮测试,看看它是否真的有效,然后标记你的答案。非常感谢您的帮助,克里斯

以上是关于MVC3 数据库实体未按预期初始化的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 未按预期绘制

未按预期应用约束

随机算法未按预期运行

实体未按预期提交(Hibernate ORM with Panache)

All 子句核心数据谓词未按预期工作

访问 SQL Randomizer 未按预期工作