0

我正在開發基於winforms和EF的桌面應用程序。多窗體winforms桌面應用程序的實體框架

目前,我有一些問題EF和架構:

  1. 同步處理資料數據。有多種形式,每種形式都使用它自己的數據庫上下文實例。當數據在一個表單上更新時,我需要在其他表單上手動更新它。有很多非靈活的回調和複製粘貼刷新數據。

  2. 有一些計算在客戶端運行並更新大量記錄。某些時候用戶需要保存它,而使用EF則需要很長時間。因此,它也是獨立的環境中運行,以便與其他單位的工作不會被阻止

  3. 沒有與結合實體DataGridViews並有與DbSet<T>.LocalDbSet<T>.ToList() annoyingproblems。當gridview中的數據保存時,有時不會在其他地方更新。

我在尋找任何可以在那裏使用的最佳實踐和靈活模式。此外,期待聽到解決同樣問題的人的意見。

感謝

+0

記住你應該創建一個新的'DbContext'實例與每個操作:不要用UI元素保持打開狀態。 EF圍繞「工作單元」模式進行設計。 – Richard

+0

每個帖子有一個問題請!並顯示您有問題的*代碼*。我們不能對模糊描述做任何事情,比如「很多非靈活的回調」,「有時不會更新」等等。 –

+0

@HighCore我不認爲WPF或MVVM實際上解決了所提到的任何問題問題(不同上下文之間的同步,綁定到本地集合,更新大量記錄時阻止長時間運行的任務等)。 – Jcl

回答

0

這是我在過去所做的那樣(絕不是「最佳做法」,但它已經爲我工作,所以這裏有雲):

  1. 使用一種「訪客模式」。有一個你的表格(或者演示者,或者你使用的任何模式)訂閱的類,表明他們想要通知變化。然後在SaveChanges()上沿着ChangeSet去通知已經請求它的那些方。我已經通過表單/演示者只訂閱特定類型的更改來優化此功能,並且我將其批給他們。每個表單都會根據他們想要的數據執行任何操作(刷新商店中的當前實體,檢查網格上顯示的實體等)。

    此外,我有一個DateTime件上的每個記錄,併爲每個記錄的主編輯集合(記錄的特殊表(大幹快上SaveChanges自動popullated)放眼全球,「客戶」,「發票」等),其中最後一次有DateTime這些記錄被更新。如果需要的話,我可以使用計時器進行輪詢(我使用該計時器進行應用程序間通信,而不是在當前應用程序內的表單之間進行通信)。

  2. 根據您的需要,在線程上執行所有更改可能適用於您。如果你的計算真的需要很長時間(或者在SaveChanges上設置併發檢查),你可能需要設置軟鎖(在應用程序中控制它們,禁用Save按鈕或者網格的可編輯性,或者其他)用戶無法保存在該線程上正在修改的記錄,但是再次,這取決於您的UI/UX偏好或要求。

  3. 我不直接綁定到DbSet(如果您正在處理多個上下文,則不需要Local),我有一個綁定的集合。「數據在其他地方未更新」應該由點來解決1

再次,我不是說這是「最好」或「推薦」的方式,但我已經用它,對我來說,它工作得很好。你的旅費可能會改變。

PS:不是官方或任何東西,但這種聯繫可能是管理的生命週期一個有趣的閱讀你DbContext(可能是或可能是不是有點過了原來的問題):http://mehdi.me/ambient-dbcontext-in-ef6/(免責聲明:我不知道使用他的「dbcontextscopes」,並指向這個鏈接的文本閱讀,我不知道他的代碼是否會好)