2017-08-23 11 views
0

Entity FrameworkとSQLiteを使用するWPFアプリケーションを作成しました。まず、ADO.NET Entity Data Modelを使用してデータベースをロードしました。すべてが非常にうまくいっていましたが、データベースでローカルファイルから選択するオプションを追加しました(データベース内のすべてのテーブルは同じである必要がありますが、データは異なるファイルでは異なる可能性があります)。私は追加することによって、DbContextファイルを編集しC#Entity Framework + SQLite - ユーザーごとにデータベースファイルを選択します。

::(私はここにhttps://stackoverflow.com/a/23105811これを見つけた)

public appDBEntities(string filename) 
    : base(new SQLiteConnection() { ConnectionString = 
     new SQLiteConnectionStringBuilder() 
      { DataSource = filename, ForeignKeys = true } 
     .ConnectionString }, true) 
    { 
    } 

ユーザーが使用してデータベースファイルを選択しているので、このソリューションをテストするために、私はコード内のいくつかの変更を自分のデータベースファイルをコピーして作られましたこの機能:私はすべてがこの機能を使用してデータベースからいくつかのデータを表示してOKかどうかをテストしたいたより

private void testButton_Click(object sender, RoutedEventArgs e) 
    { 
     // Create OpenFileDialog 
     Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 

     // Set filter for file extension and default file extension 
     dlg.DefaultExt = ".db"; 
     dlg.Filter = "Database files (*.db)|*.db"; 

     // Display OpenFileDialog by calling ShowDialog method 
     Nullable<bool> result = dlg.ShowDialog(); 

     // Get the selected file name 
     if (result == true) 
     { 
      // Open document 
      publicVariables.databasePath = dlg.FileName; 
     } 
    } 

このように

showParticipants(testDataGrid, publicVariables.databasePath); 

しかし、この機能は

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

は、この例外をスローしています:文脈から生成されたコードとコードファーストモードで使用されている

データベースファーストまたはモデルファースト開発用のEDMXファイル。これは正しく動作しません。この問題を修正するには、この例外をスローするコード行を削除しないでください。データベースファーストまたはモデルファーストを使用する場合は、Entity Framework接続文字列が起動プロジェクトのapp.configまたはweb.configに含まれていることを確認してください。独自のDbConnectionを作成する場合は、それがEntityConnectionであり、他の種類のDbConnectionではなく、DbConnectionをとる基本DbContextコンストラクタの1つに渡すことを確認してください。最初のコードまず、データベースの詳細については、とモデルまずここでEntity Frameworkのドキュメント>を参照するには、次のhttp://go.microsoft.com/fwlink/?LinkId=394715

答えて

0

私はconfigエントリを変更することにより、作業と同様の作業を持っているし、多分それはあなたのために働くだろう:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); 

connectionStringsSection.ConnectionStrings["DbStatisticsEntities"].ConnectionString = 
    "metadata=res://*/Models.DbStatisticsModel.csdl|res://*/Models.DbStatisticsModel.ssdl|res://*/Models.DbStatisticsModel.msl;provider=System.Data.SQLite.EF6;provider connection string='data source=" + this.DBFileName + "'"; 
connectionStringsSection.ConnectionStrings["DbStatisticsEntities"].ProviderName = "System.Data.EntityClient"; 
config.Save(); 
ConfigurationManager.RefreshSection("connectionStrings"); 

Properties.Settings.Default.Save(); 
Properties.Settings.Default.Reload(); 
関連する問題