
tùy bác theo code first hay db first chứ em hay làm là db firstCác bác cho em hỏi là thiết kế csdl thì sẽ thiết kế sẵn trong sql hay là dùng entity hết 100% vậy?
SELECT pt.PostId FROM PostTag pt
WHERE TagId = @tagId;
SELECT * FROM Posts WHERE Id IN (@postIds);
SELECT p.* FROM Posts p
JOIN PostTag pt ON p.Id = pt.PostId
WHERE pt.TagId = @tagId;

Nhưng cách của bác đấy phải nói thực sự rất ổn về hiệu suất, việc loại bỏ lazy load để tránh n + 1 command, bỏ quan hệ 1 - n để tránh lấy thừa dữ kiện trường hợp không cần thiết, quên hàm include rất hayLàm thì nói về hiệu suất, chứ nói sang vs hèn là thế méo nào![]()
Cái nào cũng có tác dụng cả, include là khi muốn lấy thêm item con, lazy loading dùng để load item khi cần thiết.Nhưng cách của bác đấy phải nói thực sự rất ổn về hiệu suất, việc loại bỏ lazy load để tránh n + 1 command, bỏ quan hệ 1 - n để tránh lấy thừa dữ kiện trường hợp không cần thiết, quên hàm include rất hay
Tuy nhiên nếu bỏ quan hệ 1-n em thấy rất mệt khi dùng DDD (chỉ xoay quanh aggreagateRoot) hay Generic Repository (dùng thư viện, chỉ có thể join bằng lệnh include)

Như bác @Pepe.The.Frog là muốn tránh những lỗi tiềm tàng, ảnh hưởng đến hiệu năng, em đã từng rất gà như bác ấy nói nên hiểuCái nào cũng có tác dụng cả, include là khi muốn lấy thêm item con, lazy loading dùng để load item khi cần thiết.
Tôi chưa thấy cái nào là vô dụng cả, tránh lấy thừa thì select những thuộc tính cần lấy thôi![]()
Vốn dĩ entity framework nó là repository rồi bạn ạ

Số đá còn lại giấu ở đâu?Thực sự những thớt của bác pepe đối với những lập trình viên gà mờ như em ý nghĩa vô cùng. Ban đầu em chỉ xem tutorial trên mạng, đọc source code người khác rồi học theo, rồi biết được kiến trúc, pattern có tác dụng này, kia nên sử dụng như một con vẹt.
Tuy nhiên sau khi thẩm hết các thớt của bác pepe, em đã quay lại, tìm hiểu kĩ từng dòng code mình viết, phân tích hết các ưu nhược điểm của các cách mình đang làm em cảm giác như đi lên 1 level mới, em đội ơn bác @Pepe.The.Frog vô cùng, mong bác ra nhiều thớt hơn, cho dù cả thế giới quay lưng lại với bác em vẫn sát cánh bên bác
Thấy topic hay nên join, bác dg nói lazy loading à? Lazy loading default đã bị turn off rồi bác ơiỦa em lại tưởng ưu tiên đánh lazy, rồi cẩn thận mà join chứ. Không lazy nó lôi hết lên sao các bác.

Hệ thống lúc nào cũng cần audit bất kì change data hả bác @Mỹ Chu Lang ?project hiện tại override SaveChanges để xem cái ChangeTracking rồi insert record vô audit database, hệ quả là audit bị tight coupling với SaveChanges, giờ audit bị chậm, không gọi nhiều thread để chạy concurrency được luôn![]()
List<Blog> blogs = await bloggingContext.Blogs
.Where(x => x.Url.Contains("voz"))
.Include(x => x.Posts)
.ToListAsync();
foreach (Blog blog in blogs)
{
Console.WriteLine(blog.Url);
foreach (Post post in blog.Posts)
{
Console.WriteLine(post.Title);
}
}
đúng rồi bác, dùng loop, get type từng object trong ChangeTracker rồi audit, mà đống code đó nhét hết trong cái override SaveChanges hơi dởHệ thống lúc nào cũng cần audit bất kì change data hả bác @Mỹ Chu Lang ?

coi đẩy vào interceptor rồi bắn event xử riêng dc ko bácđúng rồi bác, dùng loop, get type từng object trong ChangeTracker rồi audit, mà đống code đó nhét hết trong cái override SaveChanges hơi dở![]()
em move code audit qua background service rồi bác, dùng chung với concurrent queue, khi nào cần audit thì bỏ object vô queue này rồi background service audit từ từcoi đẩy vào interceptor rồi bắn event xử riêng dc ko bác

