しばらく前に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つのことを行うことができます:
- 実行を続行する:この場合、まったく同じ例外が発生します。
- ウォッチウィンドウからdb.Database.Create()を実行します。この場合、プログラムは最後まで正常に実行され、 SQL Management Studioで作成されたデータベース、テーブル、および行が表示されます。
簡単な解決策のようですよね?間違い!
データアクセスの前にdb.Database.CreateIfNotExists();の呼び出しを付けてみました。しかし、その行でまったく同じ例外が発生します。
db.Database.Initialize(true); 効果もありません...
注:上記の方法を使用してデータベースを作成すると、その時点からデータベースを適切に使用できるため、少なくとも半分の慰めになります:P問題は、もちろん、DropCreateIfModelChangesまたはDropCreateAlways Initalizer(私はモデルの活発な開発の真っ最中なので)。
ありがとう。
[SQLServerというよりもEntityFrameworkの問題だと思います。]