2

我收到的错误是登录请求的“无法打开数据库”NerdlyDB。登录失败。用户“计算机名\用户名”登录失败。

这是我的连接字符串:

<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 中设置一个数据库。

*编辑***

好的,所以我不是在最初做这个的电脑旁,但我有一些时间在工作中消磨时间,所以按照这里的简单说明再次尝试

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

课程:

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);
    }
}

然后我简单地运行应用程序,使用生成的视图创建一个新博客。效果很好。数据库是在我的 App_Data 文件夹中生成的,我可以很好地访问它并查看生成的架构。所以问题解决了,也许?从这一点开始,我可以使用您建议的答案来调整数据库设置等等,所以谢谢。

4

2 回答 2

1

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

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

然后,这将在您的/中查找<connectionString>with 。有关使用连接字符串设置 EF 的更多信息,请参阅此链接。name="NerdlyDB"web.configapp.config

我还建议在您的代码中使用@Eric J. 的方法。您可以在Silk.codeplex.com(特别是MileageStats.Data.SqlCe项目)上看到他的建议(通常首先是 EF 代码)的一个非常深入的示例

在单独的说明中,您似乎缺少实际的代码优先模型设置。查看项目中的MileageStatsDbContext.cs文件Silk以查看如何执行此操作的示例。

于 2012-06-20T01:18:35.523 回答
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);
    }
}
于 2012-06-20T00:31:05.513 回答