我正在創建一個網站,並且數據將從外部應用程序發送,該應用程序具有數據庫全部數據,只有部分網站需要這些數據。 「部分」是指每個表中的一些行,但不是全部。關係數據丟失時可以使用Entity Framework嗎?
手頭的業務是管理慈善憑單的業務,他們的客戶擁有賬戶。慈善機構可能希望登錄該網站並查看有關向其支付的金錢的信息,並且客戶可能想要登錄並查看有關其帳戶的信息。
但是,想要在線登錄的客戶數量只是擁有帳戶的客戶的一小部分。我們希望避免上傳所有客戶和慈善信息,因爲這將是大量的數據,這些數據必須保持最新,而且大部分數據不會被使用。
問題出現時,我們有一個已發行的憑證,但客戶沒有足夠的錢在他們的帳戶來覆蓋它。在這種情況下,代金券被持有,等待客戶存款。慈善機構希望看到持有的憑證清單,但未顯示客戶名稱,他們只能看到憑證詳細信息,例如日期,金額和號碼。
理想情況下,我希望網站數據庫完全相關,但這會導致數據丟失的問題。例如,如果我們上傳客戶詳細信息不在網站數據庫中的持有憑證的詳細信息(因爲他們無法通過網站訪問),那麼向HeldVouchers表插入將失敗,因爲外鍵引用到客戶表將指向一個不在數據庫中的客戶。
我可以使所有外部引用都爲空,但這仍然沒有幫助,因爲客戶ID不會爲空,它將包含客戶在主數據庫中的ID。
我可以檢查上傳時間,並且如果爲不在數據庫中的客戶上傳了持有的憑證,則可以將客戶ID設置爲空。沒關係,除非客戶想要訪問該網站,並且我們上傳他的詳細信息,否則我們需要更新HeldVouchers表。這將導致大量額外的工作,以及大量的額外上傳。
任何任何想法的方式來處理這個?到目前爲止,我唯一的想法是讓Web數據庫完全不關聯(我真的不喜歡這樣做),然後將擴展方法添加到將模擬EF生成的實體的實體中,除非它們直接轉到適當的DbSet並提取與「外鍵」引用相匹配的任何實體。
我想這一點,並與工作的通用擴展方法上來了,但至少有兩個非常嚴重的缺點...
public static List<T> NavColl<T>(this EntityInterface entity, Func<T, bool> f)
where T : class, EntityInterface {
return Ctx.Set<T>().ToList().Where(f).ToList();
}
(此方法返回一個導航屬性相當於我有一個類似的尋找一個單一的實體)。
如果你有一個慈善的對象(精明的命名爲「慈善」),並希望得到舉辦券,你可以做這樣的事情...
charity.NavColl<HeldVoucher>(ca => ca.CharityID == charity.ID)
第一個缺點是,只有這樣,我可以看到允許將Func傳遞給擴展方法,並且沒有讓Linq-to-Entities發出hissy fit,只是在應用Func之前枚舉了DbSet 之前的。如果那裏有很多數據,這可能會顯着減慢查詢速度。
也許更嚴重(因爲我不認爲性能是一個主要問題)是擴展方法需要一個工作環境的事實。目前,我將這些實體放在EF模型的單獨項目中,因爲這允許我從解決方案中的任何項目引用實體,而不需要那些需要參考模型項目的項目。這有助於保持圖層分離並允許測試等。
但是,如果擴展方法需要上下文,則實體項目需要對模型項目的引用,這會導致循環引用(如模型需要了解實體)。我不能將擴展方法放在模型項目中,因爲那樣我就不得不從每個想要使用這些實體的項目中引用它,這會破壞將實體分解到他們自己的項目中的全部目的。
任何任何想法?對不起,這是一個長期的問題,但我想確保我清楚地解釋了這個問題。
感謝您的澄清,你是對的,我的意思是我沒有DRI。順便說一句,我正在使用edmx。當你知道一些數據可能丟失時,你能詳細說明你如何做導航屬性嗎?例如,如果您將edmx文件中的鏈接從持有憑證添加到客戶,那麼當客戶不存在時,EF如何處理它?那就是我陷入困境的地方。 –
您根本沒有獲得附加到HeldVoucher的Customer對象,導航屬性將爲空引用。只要確保在HeldVoucher上的Customer導航屬性上將關係設置爲「0..1」即可。 –
對不起,延遲迴復。我花了幾個回覆才明白你的意思。我剛剛嘗試過,並且完全按照您的解釋進行操作。我從數據庫中刪除了所有外鍵關係,刷新了EF模型以及當數據庫關係正常工作的時候仍然存在的所有關聯。再次感謝。 –