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<SpaceUpEntities>(null);
您正在关闭数据库初始化程序。
工具 -> 选项调试 取消选中“启用属性评估和其他隐式函数调用”然后查看是否有任何错误
@Zaki:取消选中该选项后我仍然收到相同的错误
【参考方案1】:
确保您使用的初始化策略与您要达到的目标相匹配。 Database.SetInitializer<T>(...);
通过在您的 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 数据库实体未按预期初始化的主要内容,如果未能解决你的问题,请参考以下文章