首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Entity Framework 5代码-首先不创建数据库

Entity Framework 5代码-首先不创建数据库
EN

Stack Overflow用户
提问于 2013-07-12 03:09:03
回答 4查看 44.7K关注 0票数 22

我正在尝试使用Entity Framework的代码优先概念创建一个新的数据库。但是,在运行代码时,不会创建数据库(使用DropCreateDatabaseIfModelChanges设置),尽管代码运行得很好。当我试图从数据库中获取一些东西时,我看到了下面的异常。

我的项目是使用具有通用服务和存储库构造的单独DataAccess层进行设置的。因此,我的所有实体、存储库和数据库上下文都在解决方案中的一个单独项目中。

我的global.asax文件包含以下代码段。

代码语言:javascript
复制
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());

这应该会初始化一个新的数据库,如果它不在那里,对吗?

我的数据库上下文类如下所示;

代码语言:javascript
复制
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’。它们看起来像这样;

代码语言:javascript
复制
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; }
    }

代码语言:javascript
复制
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:好的,多亏了一些评论,我走得更远了。我已经向实体添加了两个属性来强制进行一些更改,并且我还创建了一个自定义初始化器,如下所示;

代码语言:javascript
复制
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);
        }
    }

我还从上下文的构造函数中删除了初始化器,所以这意味着我删除了这行代码;

代码语言:javascript
复制
Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());

之后,我将这三行添加到我的Global.asax文件中;

代码语言:javascript
复制
Database.SetInitializer(new ForceDeleteInitializer());
MyContext c = new MyContext();
c.Database.Initialize(true);

在调试时,我现在得到了这个异常;

这为我提供了以下信息:

  • InnerException说:提供者没有在ProviderManifestToken
  • InnerException中返回一个主数据库。InnerException说:“对于这个操作,需要一个到主数据库的连接。不能在‘ProviderManifestToken
  • InnerException’数据库中建立连接,因为原来的连接是打开的,并且已经从连接中删除了引用。请提供一个非打开的连接。”

执行这些操作后,数据库将无法访问,因此很可能已删除。

对此我们能做些什么呢?我很可能无法访问master数据库,因为我的主机提供商当然不会给我适当的访问权限。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17601459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档