实体框架无法打开数据库

时间:2014-10-24 15:39:01

标签: entity-framework

我跟随http://msdn.microsoft.com/en-us/data/jj193542.aspx的EF - Code First示例。这个例子工作正常。该示例在我的硬盘驱动器上创建一个包含数据库文件.mdf和.ldf。

的LocalDB

如果我删除这两个文件,我得到一个无法打开数据库异常,如果我替换文件,它的工作原理。如果我更改了我的DbContext的名称,它将起作用。

继承人的问题: 为什么我第一次运行示例时没有出现异常?某处似乎记住了文件名/上下文名称。处理这个问题的正确方法是什么?

下面的Class和DBContext,db.Blogs.Add(blog)的异常抛出;

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.Entity;

class Program 
{ 
    static void Main(string[] args) 
    { 
        using (var db = new BloggingContext()) 
        { 
            // Create and save a new Blog 
            Console.Write("Enter a name for a new Blog: "); 
            var name = Console.ReadLine(); 

            var blog = new Blog { Name = name }; 
            db.Blogs.Add(blog); 
            db.SaveChanges(); 

            // Display all Blogs from the database 
            var query = from b in db.Blogs 
                        orderby b.Name 
                        select b; 

            Console.WriteLine("All blogs in the database:"); 
            foreach (var item in query) 
            { 
                Console.WriteLine(item.Name); 
            } 

        Console.WriteLine("Press any key to exit..."); 
        Console.ReadKey(); 

    } 
} 

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

public class BloggingContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
}

2 个答案:

答案 0 :(得分:0)

这实际上与您的代码没有任何关系。如果不存在,LocalDB将为您创建一个新数据库。删除mdf / ldf文件的问题是您在不让LocalDB知道的情况下删除文件。因此,就数据而言,数据库仍然存在,但缺少支持数据库的文件。

要正确删除LocalDB数据库,请在Visual Studio中使用服务器资源管理器或SQL对象资源管理器(SQL Management Studio也应该工作)。如果数据库文件位于Web项目的app_data文件夹中,则从解决方案资源管理器中删除该文件也会正确删除该数据库。

答案 1 :(得分:0)

我真正想要做的是了解通过Code First方法生成数据库的方式/位置。经过一番研究,结果很简单。您需要做的就是在app.config或web.config文件中创建一个连接字符串,类似于......

<connectionStrings>
   <add name = YourDBContextName   
        providerName = "System.Data.SqlClient"
        connectionString = "Data Source = (localdb)\v11.0; AttachDbFilename = Path to MDF file ... 

AttachDbFile指定数据库的创建位置。您还必须将连接命名为与数据库上下文相同的名称。