「Code First」O'Reily の本から CustomConnectionFactory と PromptForDropCreateDatabaseWhenModelChages の「方法」を使用して MDF ファイルを作成します。ファイルは作成されますが、VS または SSMS からアクセスできません。VS サーバー エクスプローラーでツリービューを拡張して作成された DB テーブルとパラメーターを表示できますが、[データの表示] で次のエラーが表示されます: 「指定されたモジュールが見つかりませんでした。(HRESULT からの例外: 0x8007007E)」。このエラーを調べたところ、サーバーのアクセス許可に問題があるようですが、SSMS を最高のアクセス許可 (sysadmin、所有者など) に設定しても役に立ちませんでした。ファイル自体にパーミッションの問題があるのではないかと考えています。助けてくれてありがとう。
コードは次のとおりです。
アプリ.xaml.cs:
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));
Database.DefaultConnectionFactory = new CustomConnectionFactory();
Database.SetInitializer(new PromptForDropCreateDatabaseWhenModelChages<AppEntities>());
using (var context = new AppEntities())
{
context.Clicks.Add(new MouseClick
{
DateTimeCreated = DateTime.Now,
DateTimeModified = DateTime.Now,
Id = 1,
IsActive = true,
});
}
var mainView = new MainView
{
DataContext = new ViewModelMain(new AppEntities())
};
mainView.Show();
}
CustomConnectionFactory.cs:
class CustomConnectionFactory : IDbConnectionFactory
{
public DbConnection CreateConnection(string nameOrConnectionString)
{
var name = nameOrConnectionString.Split('.').Last().Replace("Entities", string.Empty);
var builder = new SqlConnectionStringBuilder
{
DataSource = @".\SQLEXPRESS",
AttachDBFilename = @"|DataDirectory|\App.mdf",
InitialCatalog = name,
IntegratedSecurity = true,
MultipleActiveResultSets = true,
UserInstance = true
};
return new SqlConnection(builder.ToString());
}
}
PromptForDropCreateDatabaseWhenModelChanges.cs:
public class PromptForDropCreateDatabaseWhenModelChages<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
var exists = context.Database.Exists();
if (exists && context.Database.CompatibleWithModel(true))
{
return;
}
if (exists && context.Database.CompatibleWithModel(false))
{
context.Database.Delete();
}
context.Database.Create();
}
}