Read-only archive. Login and posting are unavailable.
View Full Version : Cách truy vấn nhiều database trong entity framework
hungnt03
27-12-2019, 14:39
Mình đang gặp vde về chuyện join 2 bảng thuộc 2 database khác nhau. Khi dùng ef thì nó báo không không support trường hợp này. Hiện tại mình đang xử lý theo kiểu viết sql trực tiếp trong hàm SqlQuery, nhưng có vẻ tù quá. Trên mạng thì cũng thấy 1 cách là merge 2 edmx của 2 db lại, nhưng mà cách này cũng hơi bất tiện, mỗi lần thêm sửa xoá edmx lại phải sửa cả file merged.
Ae nào có kinh nghiệm chỉ giúp mình giải pháp ngon bổ rẻ với.
dreamnight
27-12-2019, 15:40
Mình đang gặp vde về chuyện join 2 bảng thuộc 2 database khác nhau. Khi dùng ef thì nó báo không không support trường hợp này. Hiện tại mình đang xử lý theo kiểu viết sql trực tiếp trong hàm SqlQuery, nhưng có vẻ tù quá. Trên mạng thì cũng thấy 1 cách là merge 2 edmx của 2 db lại, nhưng mà cách này cũng hơi bất tiện, mỗi lần thêm sửa xoá edmx lại phải sửa cả file merged.
Ae nào có kinh nghiệm chỉ giúp mình giải pháp ngon bổ rẻ với.
Có vẻ bạn đang có lỗi nghiêm trong trong thiết kế database rồi, mặc dù RDBMS cho phép bạn làm vấn đề này nhưng nó chỉ là giải pháp chấp vá mà thôi vì cross database nghĩa là bạn đang truy vấn dữ liệu trên 2 hệ thống khác nhau. Entity Framework hiện tại không hỗ trợ bạn vấn đề này (và hầu hết ORM đều không nốt) vì nó đi sai với định nghĩa DbContext. DbContext của EF cho phép bạn khai báo toàn bộ các mối quan hệ giữa các classes và tables trong một database mà thôi. Sử dụng ad-hoc query để execute là chấp nhận trong trường hợp của bạn và không có cách nào tốt hơn cả. Nếu cảm thấy phiền toái trong việc dùng EF để map câu raw sql đó thì bạn có thể dùng dapper để execute và map kết quả cho bạn.
hungnt03
28-12-2019, 06:20
Có vẻ bạn đang có lỗi nghiêm trong trong thiết kế database rồi, mặc dù RDBMS cho phép bạn làm vấn đề này nhưng nó chỉ là giải pháp chấp vá mà thôi vì cross database nghĩa là bạn đang truy vấn dữ liệu trên 2 hệ thống khác nhau. Entity Framework hiện tại không hỗ trợ bạn vấn đề này (và hầu hết ORM đều không nốt) vì nó đi sai với định nghĩa DbContext. DbContext của EF cho phép bạn khai báo toàn bộ các mối quan hệ giữa các classes và tables trong một database mà thôi. Sử dụng ad-hoc query để execute là chấp nhận trong trường hợp của bạn và không có cách nào tốt hơn cả. Nếu cảm thấy phiền toái trong việc dùng EF để map câu raw sql đó thì bạn có thể dùng dapper để execute và map kết quả cho bạn.
hệ thống e làm nó tổng hợp dữ liệu từ các hệ thống nhỏ hơn để trích xuất ra report, các thứ đã có sẵn, nên là k được sửa gì ở phía db. Cảm ơn a đã có những góp ý quý báu.
Cho mình hỏi ngu một chút, không hiểu mình có hiểu vấn đề của bạn đúng không, nhưng mình nghĩ là bạn có thể join bảng trên tầng C# application được mà nhi. Bạn load các dữ liệu cần thiết của cả 2 bảng lên C#, rồi dùng LinQ join trên C# được mà nhỉ.
Còn có cách khác là integrate hết các dữ liệu từ nhiều database của các hệ thống nhỏ hơn khác nhau về một mối, và cái mối đó gọi là... data warehouse. :shame: 1355308
dreamnight
28-12-2019, 09:16
Cho mình hỏi ngu một chút, không hiểu mình có hiểu vấn đề của bạn đúng không, nhưng mình nghĩ là bạn có thể join bảng trên tầng C# application được mà nhi. Bạn load các dữ liệu cần thiết của cả 2 bảng lên C#, rồi dùng LinQ join trên C# được mà nhỉ.
Còn có cách khác là integrate hết các dữ liệu từ nhiều database của các hệ thống nhỏ hơn khác nhau về một mối, và cái mối đó gọi là... data warehouse. :shame: 1355308
Ko đâu, ý bạn đó là ở sql server thực thi 1 câu truy vấn truy xuất dữ liệu trên 2 database khác nhau(nhưng cùng trên 1 sql server). Vd: Select * From . o join . j on o.id = j.orderid. Nên join câu đó trên application tức là phải truy xuất database 2 lần và join in-memory ở tầng ứng dụng thì nó ngốn ram dữ lắm. Trừ trường hợp bạn đó hiểu rõvmệnh đề Where của mình lấy tối đa mỗi bảng bao nhiêu records thi ok
karenshii
28-12-2019, 18:37
Còn có cách khác là integrate hết các dữ liệu từ nhiều database của các hệ thống nhỏ hơn khác nhau về một mối, và cái mối đó gọi là... data warehouse. :shame: 1355308
Ôi, mặt trời chân lý.
Em nghe từ warehouse nhiều lắm, mà cũng ếu hiểu nó là cái gì.
Đọc 1 câu giải thích của bác, hiểu ra chân lý luôn
Sent from Xiaomi Redmi Note 5 using vozFApp (http://bit.ly/vozfapp)
RainKid_yeuguitar
31-12-2019, 14:54
mô hình cluster
cuoc_song
01-01-2020, 21:17
Nói không với việc join dữ liệu giữa các db khác nhau nhé. Bác nên tổng hợp dữ liệu về 1 db bằng ETL ( thằng db nào cũng hỗ trợ cái này) rồi mới thực hiện report hoặc pre compute.
netsstea
06-01-2020, 16:51
Mình đang gặp vde về chuyện join 2 bảng thuộc 2 database khác nhau. Khi dùng ef thì nó báo không không support trường hợp này. Hiện tại mình đang xử lý theo kiểu viết sql trực tiếp trong hàm SqlQuery, nhưng có vẻ tù quá. Trên mạng thì cũng thấy 1 cách là merge 2 edmx của 2 db lại, nhưng mà cách này cũng hơi bất tiện, mỗi lần thêm sửa xoá edmx lại phải sửa cả file merged.
Ae nào có kinh nghiệm chỉ giúp mình giải pháp ngon bổ rẻ với.
Theo kinh nghiệm của mình, thì bận tốt nhất là làm 1 aggregate service để merge 2 database vào 1, có thể move hết vào cùng 1 database, hoặc move hết vào elastic search, hoặc hbase. Sau đó thực hiện làm report trên đó là tiện nhất.
Còn như các bạn khác cũng nói rồi, EF ko làm được việc đó
vBulletin® v3.8.0, Copyright ©2000-2026, Jelsoft Enterprises Ltd.