无法首先从EF代码打开生成的数据库

时间:2012-06-20 00:21:48

标签: c# entity-framework-4 ef-code-first asp.net-mvc-4

我得到的错误是“无法打开数据库”NerdlyDB“登录请求。登录失败。 用户'ComputerName \ User Name'登录失败。

这是我的连接字符串:

<add name="NerdlyDB" connectionString="Data Source=(LocalDb)\v11.0; Integrated Security=SSPI; initial catalog= NerdlyDB" providerName="System.Data.SqlClient"/>

此数据库是使用EF代码第一种方法生成的。我是这个人的新手,所以我会告诉你我做了什么,以防它出在某个地方:

我的实体类:

namespace NerdlyThings.Models
{
public class Post
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Content { get; set; }
    public DateTime Date { get; set; }
    public string Tags { get; set; }
}
}

DBContext类

namespace NerdlyThings.Models
{
public class NerdlyDB : DbContext
{
    public DbSet<Post> Posts { get; set; }
    public DbSet<Comment> Comments { get; set; }
    public DbSet<Image> Images { get; set; }
    public DbSet<Quote> Quotes { get; set; }
}
}

我看到错误显然是一个身份验证问题,但我不知道在哪里首先使用代码设置它,只能通过在sql server management studio中设置db。

*编辑***

好的,所以我不是我原来做过的电脑,但是我有时间在工作中杀人,所以按照简单的指示给我另一个去here

我在MVC4互联网应用程序模板中的Visual Studio 2012 RC中做到了这一点。像梦一样工作,我只能假设我的另一台计算机上有一些奇怪的配置问题,或者有些东西搞砸了。无论如何,这就是我所做的:

类:

namespace CodeFirstBlog.Models
{
public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string BloggerName { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public int BlogId { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

public class Comment
{
    public int Id { get; set; }
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public int PostId { get; set; }
    public Post Post { get; set; }
}
}

DBContext类:

namespace CodeFirstBlog.Models
{
public class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<Comment> Comments { get; set; }
}
}

我设置了这些,然后创建了一个像这样的控制器(只是它生成了我选择我的上下文和类):

public class BlogController : Controller
{
    private BlogContext db = new BlogContext();

    //
    // GET: /Blog/

    public ActionResult Index()
    {
        return View(db.Blogs.ToList());
    }

    //
    // GET: /Blog/Details/5

    public ActionResult Details(int id = 0)
    {
        Blog blog = db.Blogs.Find(id);
        if (blog == null)
        {
            return HttpNotFound();
        }
        return View(blog);
    }

    //
    // GET: /Blog/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Blog/Create

    [HttpPost]
    public ActionResult Create(Blog blog)
    {
        if (ModelState.IsValid)
        {
            db.Blogs.Add(blog);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(blog);
    }

    //
    // GET: /Blog/Edit/5

    public ActionResult Edit(int id = 0)
    {
        Blog blog = db.Blogs.Find(id);
        if (blog == null)
        {
            return HttpNotFound();
        }
        return View(blog);
    }

    //
    // POST: /Blog/Edit/5

    [HttpPost]
    public ActionResult Edit(Blog blog)
    {
        if (ModelState.IsValid)
        {
            db.Entry(blog).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(blog);
    }

    //
    // GET: /Blog/Delete/5

    public ActionResult Delete(int id = 0)
    {
        Blog blog = db.Blogs.Find(id);
        if (blog == null)
        {
            return HttpNotFound();
        }
        return View(blog);
    }

    //
    // POST: /Blog/Delete/5

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {
        Blog blog = db.Blogs.Find(id);
        db.Blogs.Remove(blog);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

然后我只是运行应用程序,使用生成的视图创建一个新的Blog。效果很好。数据库是在我的App_Data文件夹中生成的,我可以正常访问它并查看生成的模式。所以问题解决了,也许吧?从这一点开始,我可以使用你建议的答案来调整db设置和诸如此类的东西,谢谢。

2 个答案:

答案 0 :(得分:1)

您是否正在将DBContext类连接到某个连接字符串?我的猜测是缺失,因此导致问题。我经常看到DBContext类的构造函数中指定的连接字符串(参见下面的示例):

public class NerdlyDB : DbContext
{
    public NerdlyDB() : base("NerdlyDB")
    {
    }
    ...

然后,您会在<connectionString> / name="NerdlyDB"中找到web.config app.config MileageStats.Data.SqlCe。有关使用连接字符串设置EF的详细信息,请参阅此link

我还建议在代码中使用@Eric J.的方法。您可以在silk.codeplex.com(特别是Silk项目)上看到他的建议(以及EF代码一般)的深入示例

单独说明,您似乎缺少实际代码第一个模型设置。查看{{1}}项目中的MileageStatsDbContext.cs文件,查看如何执行此操作的示例。

答案 1 :(得分:0)

到目前为止,我发现的最佳方法是创建自己的IDatabaseInitializer来运行创建索引和创建用户所需的命令。

public class MyContext : DbContext
{
    static private Initializer DbInitializer;
    static MyContext()
    {
        DbInitializer = new MyContext.Initializer();
        Database.SetInitializer<MyContext>(DbInitializer);
    }
}
public class Initializer : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        string ddl = "(Some SQL command to e.g. create an index or create a user)";
        context.Database.ExecuteSqlCommand(ddl);
    }
}