【问题标题】:MVC3 Database entities don't get initialized as expectedMVC3 数据库实体未按预期初始化
【发布时间】: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()) 实体应该已经初始化,但我最终得到了这个错误

错误信息:

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

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

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

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

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

唐做

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

【问题讨论】:

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

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


【解决方案1】:

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

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

Database.SetInitializer<SpaceUpEntities>(null);

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


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

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

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

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

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

【讨论】:

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