2

私が得ているエラーは、「ログインによって要求されたデータベース "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 でデータベースを設定するだけです。

*編集***

わかりました、最初にこれを行ったコンピューターのそばにいませんが、仕事で時間をつぶす時間があったので、こちらの簡単な指示に従ってもう一度試してみました

これは、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が検索さname="NerdlyDB"れます。接続文字列を使用した EF の設定の詳細については、このリンクを参照してください。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 に答える