Những lỗi phổ biến nhất và chống lập trình viên lập trình người dùng NHibernate là gì?


28

Những lỗi phổ biến nhất và chống lập trình viên lập trình người dùng NHibernate là gì? Vui lòng giải thích lý do tại sao đó là những thực tiễn xấu hoặc cung cấp liên kết đến tài nguyên để đọc thêm.

Ví dụ:

  • Một mô hình chống phổ biến cho các lập trình viên NHibernate mới là sử dụng nhận dạng / POID gốc thay vì các lực lượng kiểu ORM. Đọc thêm tại đây...

1
Bạn có thể tìm thấy một số lỗi phổ biến ở đây: Cảnh báo

1
Ngoài ra có một số bài viết có giá trị ở đây về Cạm bẫy NHibernate

Câu trả lời:


34

Các vấn đề "thường được giải thích" cá nhân của tôi:

Chống mẫu

Loay hoay với các đối tượng tách rời (SaveOrUpdate hoặc Hợp nhất cộng với một số mã lộn xộn) thay vì sử dụng DTO. Các thực thể càng phức tạp, mã càng lộn xộn. (Điều đó cũng có nghĩa là nó hoạt động khá tốt với các thực thể tầm thường.) Ayende cũng gọi nó là Mẫu vũ nữ thoát y và giải thích vấn đề đóng gói.

Không hiểu sự thiếu hiểu biết dai dẳng và viết các ứng dụng NH như khi sử dụng SQL rõ ràng. Triệu chứng của điều đó: gọi Cập nhật sau khi thay đổi một đối tượng, tự hỏi tại sao các thay đổi vẫn tồn tại ngay cả khi Cập nhật chưa được gọi, tự hỏi làm thế nào để tránh các thay đổi được duy trì.

Không hiểu giao dịchđơn vị của mô hình làm việc . Chống mẫu thường xuyên: giao dịch ngầm, phiên trên mỗi hoạt động và phiên trên mỗi ứng dụng. Một số đọc thêm:

Sử dụng các sự kiện NH để đưa logic ứng dụng vào (ví dụ: theo dõi thay đổi trong trình kích hoạt chèn và cập nhật)

Tạo một lớp mỗi bảng . Một số người không hiểu về 3M, những người khác không hiểu thiết kế quan hệ.

Sai lầm

sử dụng một-một thay vì nhiều-một. Tôi đã cố gắng để giải thích trong câu trả lời này .

Sử dụng tham gia tìm nạp kết hợp với SetMaxResult. Câu trả lời mới nhất của tôi liên quan đến chủ đề đó:

Viết thực thể tự thay đổi . Khi một thực thể không trả lại chính xác giá trị đã được đặt bởi NH, nó sẽ bị coi là bẩn và được cập nhật trong mỗi phiên. Ví dụ: thay thế bộ sưu tập liên tục NH trong bộ thiết lập thuộc tính.

  IList<Address> Addresses
  {
    get { return addresses; }
    // will cause the addresses collection to be built up from scratch
    // in the database in every session, even when just reading the entity.
    set { addresses = new List<Address>(value); }
  }

  int Whatever
  {
    // will make the entity dirty after reading negative values from the db.
    // this causes unexpected updates after just reading the entity.
    get { if (whatever < 0) return 0; }
    set { whatever = value; }
  }

Có thể nhiều hơn là sau.


2
+1: Bạn nên thêm "Không sử dụng mẫu Đơn vị công việc" và "Một phiên cho mỗi ứng dụng" vào danh sách của bạn.
Chim ưng

@Falcon: vâng có lẽ. Đó là một vấn đề "không hiểu giao dịch" chung. Các đơn vị công việc là một chút bao phủ bởi sự thiếu hiểu biết dai dẳng. Mặc dù chúng là những khái niệm hoàn toàn khác nhau, nhưng chúng dẫn đến cùng một mô hình.
Stefan Steinegger

5

" Chọn vấn đề N + 1 ".

Đây là nơi bạn kết thúc việc thực hiện A select cho mỗi thực thể bạn muốn thao tác (N) và chọn để lấy danh sách các thực thể (+1), thay vì một lựa chọn duy nhất của tất cả các thực thể và thuộc tính của chúng.


1
  • Quá nhiều thứ trừu tượng
  • Không sử dụng Automappings với FluentNHibernate

Điểm đầu tiên hơi mơ hồ, nhưng trong trường hợp bạn đang đề cập đến những khái niệm ngớ ngẩn như việc che giấu ISession đằng sau một "Kho lưu trữ" hoặc "DAO", tôi đồng ý.
chris

1
Tuy nhiên, điểm thứ hai là vô nghĩa. Có nhiều lý do tại sao chúng ta thường muốn có quyền kiểm soát chi tiết tốt đối với mô hình dữ liệu vật lý và có thể tách rời điều đó khỏi mô hình miền. Rốt cuộc, đó là điểm của "M" trong "ORM". Sử dụng tự động hóa (trong khi hữu ích trong các tình huống đơn giản) đánh bại điều đó. Bên cạnh đó, cũng có vấn đề về các lược đồ cơ sở dữ liệu kế thừa tích hợp, trong đó tự động hóa là vô ích.
chris

Tôi sử dụng inbuilt bởi ánh xạ dựa trên quy ước mã. Nó xử lý rất nhiều chuyện tào lao mà nếu không tôi sẽ phải lặp lại. Tuy nhiên, nó vẫn cung cấp sự tự do cho nhưng tùy chỉnh cụ thể thực thể được xếp lớp trên ánh xạ được tạo bởi quy ước. Nó siêu hữu ích.
Sam

1

Cố gắng trừu tượng hóa nó để bạn có thể chuyển sang Entity Framework (hoặc một cái gì đó khác) vào một ngày sau đó.

Điều này là rất nhiều, khó hơn nhiều so với hầu hết những người cố gắng nhận ra nó. Có rất nhiều sự khác biệt giữa hai thứ có thể khiến bạn vấp ngã theo những cách có thể khá tinh tế đôi khi. Cuối cùng cũng rất hiếm khi nó thực sự cần thiết - đến mức bạn có thể tỉ mỉ cố gắng thực hiện nó trong nhiều năm trước khi phát hiện ra rằng cách tiếp cận của bạn hoàn toàn sai.

Ngoài ra, nó hạn chế bạn sử dụng toàn bộ nhiều tính năng hữu ích và quan trọng của NHibernate như bộ nhớ đệm cấp hai, chặn, quản lý đồng thời, theo dõi thay đổi, truy vấn tìm nạp, v.v.

Nếu thực sự có nhu cầu hợp lệ để chuyển đổi giữa NHibernate và Entity Framework, sẽ có một dự án được phát triển tích cực để hỗ trợ điều này trên GitHub (có lẽ là một thứ gì đó tương tự như CommonServiceLocator) với nhiều người đóng góp và yêu cầu kéo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.