我正在尝试使用Entity Framework的代码优先概念创建一个新的数据库。但是,在运行代码时,不会创建数据库(使用DropCreateDatabaseIfModelChanges
设置),尽管代码运行得很好。当我试图从数据库中获取一些东西时,我看到了下面的异常。
我的项目是使用具有通用服务和存储库构造的单独DataAccess
层进行设置的。因此,我的所有实体、存储库和数据库上下文都在解决方案中的一个单独项目中。
我的global.asax
文件包含以下代码段。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
这应该会初始化一个新的数据库,如果它不在那里,对吗?
我的数据库上下文类如下所示;
namespace Website.DAL.Model
{
public class MyContext : DbContext
{
public IDbSet<Project> Projects { get; set; }
public IDbSet<Portfolio> Portfolios { get; set; }
/// <summary>
/// The constructor, we provide the connectionstring to be used to it's base class.
/// </summary>
public MyContext()
: base("MyConnectionString")
{
}
static MyContext()
{
try
{
Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// This method prevents the plurarization of table names
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
}
}
}
我根据互联网上的一些教程和文章创建了这个类。这对我来说是全新的,但据我所知,到目前为止一切似乎都是正确的。现在我使用的两个实体。它们被称为'Project‘和'Portfolio’。它们看起来像这样;
public class Portfolio
{
[Key]
public Guid Id { get; set; }
public String Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool IsPublished { get; set; }
public virtual ICollection<Project> Projects { get; set; }
}
和
public class Project
{
[Key]
public Guid Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool IsPublished { get; set; }
public String Title { get; set; }
}
我使用的数据库是在外部服务器上运行的,它与我使用的主机提供商一起提供。我已经启动并运行了一个SQL Server数据库,该数据库的连接字符串位于网站项目的web.config
中。我已经尝试删除数据库,并让代码重新创建它,不幸的是,这不起作用。我是不是漏掉了什么明显的东西?或者这可能是一件简单的事情,比如创建数据库的服务器的访问权限?
注意:当我运行Database-Update -Script
命令来生成SQL代码时,似乎创建了用于创建所有表的正确SQL语句。
更新1:好的,多亏了一些评论,我走得更远了。我已经向实体添加了两个属性来强制进行一些更改,并且我还创建了一个自定义初始化器,如下所示;
public class ForceDeleteInitializer : IDatabaseInitializer<MyContext>
{
private readonly IDatabaseInitializer<MyContext> _initializer = new DropCreateDatabaseIfModelChanges<MyContext>();
public ForceDeleteInitializer()
{
//_initializer = new ForceDeleteInitializer();
}
public void InitializeDatabase(MyContext context)
{
//This command is added to prevent open connections. See http://stackoverflow.com/questions/5288996/database-in-use-error-with-entity-framework-4-code-first
context.Database.ExecuteSqlCommand("ALTER DATABASE borloOntwikkel SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
_initializer.InitializeDatabase(context);
}
}
我还从上下文的构造函数中删除了初始化器,所以这意味着我删除了这行代码;
Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());
之后,我将这三行添加到我的Global.asax文件中;
Database.SetInitializer(new ForceDeleteInitializer());
MyContext c = new MyContext();
c.Database.Initialize(true);
在调试时,我现在得到了这个异常;
这为我提供了以下信息:
执行这些操作后,数据库将无法访问,因此很可能已删除。
对此我们能做些什么呢?我很可能无法访问master数据库,因为我的主机提供商当然不会给我适当的访问权限。
https://stackoverflow.com/questions/17601459
复制相似问题