8

しばらく前にMVC3プロジェクトでEF4.1 (Code First )を使用しましたが、良かったです。

今日、私はWinFormsプロジェクトでEF 4.3.1(Code First)を使用しようとしましたが、実際のブードゥーに遭遇しました:(私が取り組んでいた元のプロジェクトはWinFormsでしたが、添付のコンソールアプリケーションコードにも同じことが当てはまります)。

単純なクラスをデータベースに入力しようとすると、次の例外が発生 します。ログインによって要求されたデータベース「テスト」を開くことができません。ログインに失敗しました。ユーザー'[ComputerName]\[Administrator]'のログインに失敗しました。

SQL Server(2008 R2)の構成を確認しようとしましたが、ユーザーにサーバーに対するすべてのアクセス許可があります。

注:アプリケーションを最初に実行したとき、データベースは存在しませ

次のサンプルコードでも機能しません:

class Program
{
    public static void Main()
    {
        var person = new Person { Name = "Nathan" };
        using (var db = new MyContext())
        { //#1
            db.Persons.Add(person);
            db.SaveChanges();
        }
        Console.Write("Person saved !");
        Console.ReadLine();
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Person> Persons { get; set; }
    public MyContext()
        : base("Data Source=localhost;Database=Test;Integrated Security=True;")
    { }
}

EF4.3.1を再インストールしようとしましたが無駄になりました。SQL-Serverを再起動しても効果はありませんでした。

注:似たような質問がたくさんあることに気づきましたが、どちらも私のもの同じで答えられたものはありません-ここで幸運になることを願っています:)

明確にするために:アクセスを拒否されているユーザーは、マシンの所有者(ローカル管理者)です。

編集:私はいくつかの実験を実行してきましたが、非常に奇妙なものを見つけました:

「#1」とマークされた行でプログラムを一時停止し、ウォッチウィンドウでdb.Database.Exists()の値を確認すると、 「関数評価ではすべてのスレッドを実行する必要があります」という小さな波状のボタンが表示されます。クリックしてすべてのスレッドを実行させることができます。 上記の段落を描いた画像

そのボタンをクリックすると、関数はFalseと評価されます。

今、私は2つのことを行うことができます:

  1. 実行を続行する:この場合、まったく同じ例外が発生します。
  2. ウォッチウィンドウからdb.Database.Create()を実行します。この場合、プログラムは最後まで正常に実行され、 SQL Management Studioで作成されたデータベース、テーブル、および行が表示されます。

簡単な解決策のようですよね?間違い!

データアクセスの前にdb.Database.CreateIfNotExists();の呼び出しを付けてみました。しかし、その行でまったく同じ例外が発生します。

db.Database.Initialize(true); 効果もありません...

注:上記の方法を使用してデータベースを作成すると、その時点からデータベースを適切に使用できるため、少なくとも半分の慰めになります:P問題は、もちろん、DropCreateIfModelChangesまたはDropCreateAlways Initalizer(私はモデルの活発な開発の真っ最中なので)。

ありがとう。

[SQLServerというよりもEntityFrameworkの問題だと思います。]

4

1 に答える 1

18

「例外がスローされたときにブレーク」オプション ([デバッグ] -> [例外]) がオンになっていると、デバッグ時にこの例外が表示されます。EF はデータベースに接続しようとしていますが、データベースがまだ存在しないため失敗し、例外がスローされます。上記のオプションがオンになっているため、例外が表示されます。この例外は実際には Entity Framework によってキャッチされ、EF は master データベースに接続して、最初のステップで接続しようとしていたデータベースを作成します。データベースが作成されると、元の接続文字列を使用してデータベースと通信します。そのため、F5 キーを押してデバッグを続行することができます。これは、例外が処理される最初のチャンスの例外であるためです。

于 2012-05-08T14:27:16.877 に答える