thảo luận [Thảo Luận] Sử dụng Entity Framework thế nào cho sang

Đang sử dụng EF để làm data access cho 1 dự án, lúc đầu tính dùng Dapper nhưng mà cty lại yêu cầu EF.
Cái entity mình sẽ không config dạng data annotation vì nhìn khá dơ mắt... Mà thay vào đó mình dùng fluent api để config constraint, FK, PK, relationship, ...

Entity thì mình không để Entity khác vô để tạo relationship mà dùng HasOne, WithOne, WithMany, ... ở cái modelBuilder của file context. Entity chỉ để Id của entity khác làm thành FK.
Cách này tránh việc EF gọi đệ quy các relationship với nhau tuy nhiên, sẽ không dùng Include của EF được mà phải sẽ phải dùng Join nếu muốn kết các bảng lại với nhau. Join nhiều bảng lại sẽ tạo thành nguyên 1 cục nhìn khá xấu, hiện tại không biết fix ntn ngoài việc sử dụng stored proc để thay thế.

Giới hạn lại độ dài của các field trong entity, nếu không thì EF nó sẽ đổi vd string thành varchar max khá là có hại.

Mấy cái query dạng get 1 chiều để mang lên cho UI thôi thì mình nghĩ tốt nhất nên thêm cái AsNoTracking để optimize performance

Cần mấy thím góp ý mấy cái trên hoặc góp ý thêm
 
Vấn đề là mỗi lần loop 1 Blog thì sẽ sinh ra thêm query để lấy Post nữa do cái Post k dc fetch về trc đó
Đoạn này có 2 vòng for thì càng tệ hơn. Nếu dùng MSSQL thì có thể mở SQL Profiler để thấy query gửi lên server.
Ủa vậy là dòng:
List<Blog> blogs = await bloggingContext.Blogs
.Where(x => x.Url.Contains("voz"))
.ToListAsync();

Đến đây tức là vẫn chưa gửi lệnh lên SQL à bác. Mà đến khi chạy ForLoop mới bắt đầu gửi lệnh lên SQL?
 
Ủa vậy là dòng:
List<Blog> blogs = await bloggingContext.Blogs
.Where(x => x.Url.Contains("voz"))
.ToListAsync();

Đến đây tức là vẫn chưa gửi lệnh lên SQL à bác. Mà đến khi chạy ForLoop mới bắt đầu gửi lệnh lên SQL?
đến đây là gửi lệnh rồi, mà nó chỉ fetch về list Blogs thôi, sau đấy loop vào list Blog để lấy Post ra thì nó lại gửi lệnh tiếp đó
 
Ủa vậy là dòng:
List<Blog> blogs = await bloggingContext.Blogs
.Where(x => x.Url.Contains("voz"))
.ToListAsync();

Đến đây tức là vẫn chưa gửi lệnh lên SQL à bác. Mà đến khi chạy ForLoop mới bắt đầu gửi lệnh lên SQL?
Không phải, ý mấy bác trên nói chỉ ở trường hợp enable lazy loading. Khi bạn truy cập vào các navigation property trong object entity thì nó sẽ chạy query khác để lấy data cho property đó. Nhưng mà thực sự lazy loading rất ít project dùng và mình nhớ cũng đâu phải default như bác kia nói. Để enable lazy load cũng phải config proxies hoặc dùng lazy loader mà. Nói chung nếu dùng eager loading như bình thường thì để map 1-to-many trong entity cũng tiện để include trong nhiều trường hợp mà không dính issue n+1 như các bác trên nói.
 
Không phải, ý mấy bác trên nói chỉ ở trường hợp enable lazy loading. Khi bạn truy cập vào các navigation property trong object entity thì nó sẽ chạy query khác để lấy data cho property đó. Nhưng mà thực sự lazy loading rất ít project dùng và mình nhớ cũng đâu phải default như bác kia nói. Để enable lazy load cũng phải config proxies hoặc dùng lazy loader mà. Nói chung nếu dùng eager loading như bình thường thì để map 1-to-many trong entity cũng tiện để include trong nhiều trường hợp mà không dính issue n+1 như các bác trên nói.

Ờ, nếu tắt lazy load thì tránh được vụ n + 1. Ít project dùng hay ko ko biết chứ tôi ngồi trong cái giếng của tôi thì tôi nhảy vào project nào cũng dùng hết. Hay tại tôi xui... :ah:


Map 1-many khi đẩy Enity ra controller sẽ serialize ra json sẽ bị loop. Tôi thích dùng 1 entity cho cả domain models, ko dùng DTO để tránh map miếc gì cả :sad:
 
Ờ, nếu tắt lazy load thì tránh được vụ n + 1. Ít project dùng hay ko ko biết chứ tôi ngồi trong cái giếng của tôi thì tôi nhảy vào project nào cũng dùng hết. Hay tại tôi xui... :ah:


Map 1-many khi đẩy Enity ra controller sẽ serialize ra json sẽ bị loop. Tôi thích dùng 1 entity cho cả domain models, ko dùng DTO để tránh map miếc gì cả :sad:
Ko dùng DTO thì data trả về FE dư thừa sao ?
 
Đang sử dụng EF để làm data access cho 1 dự án, lúc đầu tính dùng Dapper nhưng mà cty lại yêu cầu EF.
Cái entity mình sẽ không config dạng data annotation vì nhìn khá dơ mắt... Mà thay vào đó mình dùng fluent api để config constraint, FK, PK, relationship, ...

Entity thì mình không để Entity khác vô để tạo relationship mà dùng HasOne, WithOne, WithMany, ... ở cái modelBuilder của file context. Entity chỉ để Id của entity khác làm thành FK.
Cách này tránh việc EF gọi đệ quy các relationship với nhau tuy nhiên, sẽ không dùng Include của EF được mà phải sẽ phải dùng Join nếu muốn kết các bảng lại với nhau. Join nhiều bảng lại sẽ tạo thành nguyên 1 cục nhìn khá xấu, hiện tại không biết fix ntn ngoài việc sử dụng stored proc để thay thế.

Giới hạn lại độ dài của các field trong entity, nếu không thì EF nó sẽ đổi vd string thành varchar max khá là có hại.

Mấy cái query dạng get 1 chiều để mang lên cho UI thôi thì mình nghĩ tốt nhất nên thêm cái AsNoTracking để optimize performance

Cần mấy thím góp ý mấy cái trên hoặc góp ý thêm

Xài ORM là để thể hiện relationship mà đi bỏ đi relationship là sao man? Muốn tránh vụ vòng thì bỏ map one-to-many như tôi chứ many-to-one thì vẫn phải có chứ. :beat_brick:

Vụ tránh varchar max là chính xác vì EF có bug về nó làm performance rất chậm.

Vụ AsNoTracking() cho read only query cũng chính xác luôn.
 
Xài ORM là để thể hiện relationship mà đi bỏ đi relationship là sao man? Muốn tránh vụ vòng thì bỏ map one-to-many như tôi chứ many-to-one thì vẫn phải có chứ. :beat_brick:

Vụ tránh varchar max là chính xác vì EF có bug về nó làm performance rất chậm.

Vụ AsNoTracking() cho read only query cũng chính xác luôn.
Anh zai đọc sách gì về Entity FW mà pro thế anh zai
 
Em ko dùng lazy loading bao giờ vì em ko biết config :big_smile: toàn dùng eager loading. Mà các bác cho em hỏi là em để nó tự generate ra model từ schema (DB First) thì ổn không vậy ạ? :pudency:
 
1648222123284.png

bác thử đọc quyển này xem, em đang ngâm quyển này nói khá sâu về EF, trước toàn xem tutor vs blog giờ đọc quyển này thấy nhiều cái mk chưa b
 
Cái này đi từ cơ bản đúng k bác, tại 2 năm rồi em chưa dùng EF nên quên nhiều phết
đi từ cơ bản luôn bác có cả sourcode nữa, phân tích từng câu query rồi per các thứ
cơ bản thì em nghĩ nếu nhanh thì cứ xem 1 tutor là khỏe r, có cả video 1 2 tiếng mà, sách thì em kiểu rảnh đọc vừa để b sâu hơn vừa luyện Tiếng Anh:):):)
 
đi từ cơ bản luôn bác có cả sourcode nữa, phân tích từng câu query rồi per các thứ
cơ bản thì em nghĩ nếu nhanh thì cứ xem 1 tutor là khỏe r, có cả video 1 2 tiếng mà, sách thì em kiểu rảnh đọc vừa để b sâu hơn vừa luyện Tiếng Anh:):):)
Haha em cũng muốn đọc sách cho ngấm bác ạ :)) e cx k vội gì mac
 
Rồi một a gà con lon ton sẽ ko gọi include vào mà đẩy cái object PhongBan ra ngoài. Rồi for loop cái cái list nhân viên ấy….

Code a ấy vẫn chạy, rồi thậm chí a ta quăng nó lên UI đẩy cả entity ra service, controller rồi nó seriealize ra json… Cho dù cái service chỉ cần mổi phòng ban thôi…

Ai kiểm soát dc chuyện đó

via theNEXTvoz for iPhone
Thế code review đâu? Code tào lao đưa lên thì mấy ông senior trong team reject pull request luôn chớ ở đó mà không ai kiểm soát
 
Mình đang dùng JPA/Hibernate để code đồ án tốt nghiệp, mà tới đoạn mapping có inheritance với relationship phức tạp quá nên mình ngắt ra luôn, dùng 1 field type để code tay rồi query riêng :> k biết làm v có ổn không, chứ mapping theo strategy của hibernate nó có sẵn lúc query thì lấy nó join bảng nohope quá, :v
 
Back
Top