簡體   English   中英

C#實體框架+ SQLite-按用戶選擇數據庫文件。

[英]C# Entity Framework + SQLite - selecting database file by user.

我制作了使用實體框架和SQLite的WPF應用程序。 在開始時,我通過ADO.NET實體數據模型加載了數據庫。 一切工作都很好,但是現在我想為用戶添加選項以從具有數據庫的本地文件中進行選擇(數據庫中的所有表應相同,但不同文件的數據可能有所不同)。 因此,為了測試該解決方案,我復制了數據庫文件並進行了一些代碼更改:

我通過添加以下內容編輯了DbContext文件:(我在這里https://stackoverflow.com/a/23105811找到了它)

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

用戶正在使用此功能選擇數據庫文件:

    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;
        } 
    }

比我想通過使用此功能顯示數據庫中的一些數據來測試一切是否正常:

    public static void showParticipants(DataGrid participantsDataGrid, string connectionString)
    {
        using (var db = new appDBEntities(connectionString))
        {
            var query = from c in db.Participant
                        join gender in db.Sex on c.Sex equals gender.id
                        join club in db.Club on c.Club equals club.id
                        join nation in db.Nation on c.Nationality equals nation.id
                        select c.id;

            var data = query.ToList();
            participantsDataGrid.ItemsSource = data;
            db.Dispose();
        }

    }

像這樣:

showParticipants(testDataGrid, publicVariables.databasePath);

但是這個功能

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

拋出此異常:

上下文在Code First模式下與從EDMX文件生成的代碼一起用於Database First或Model First開發。 這將無法正常工作。 若要解決此問題,請不要刪除引發此異常的代碼行。 如果希望使用數據庫優先或模型優先,請確保在啟動項目的app.config或web.config中包含Entity Framework連接字符串。 如果要創建自己的DbConnection,請確保它是EntityConnection而不是其他某種類型的DbConnection,並將其傳遞給采用DbConnection的基本DbContext構造函數之一。 要了解有關“代碼優先”,“數據庫優先”和“模型優先”的更多信息,請參見Entity Framework文檔>此處: http : //go.microsoft.com/fwlink/?LinkId=394715

我有一個類似的任務可以通過更改配置條目來工作,也許對您有用:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM