2010-11-18 43 views
8

Bạn có sử dụng SchemaExport và SchemaUpdate trong các ứng dụng thực tế không? Ban đầu, bạn tạo mô hình và sau đó tạo lược đồ? Nó có hoạt động không? Hoặc, bạn chỉ sử dụng nó để kiểm tra ...NHibernate và mã đầu tiên

Thông thường, tôi tạo db (sử dụng dự án cơ sở dữ liệu phòng thu trực quan) và sau đó ánh xạ và các lớp liên tục hoặc thực thể EF sử dụng trình thiết kế. Nhưng bây giờ, tôi muốn thử cách tiếp cận mã đầu tiên với Fluent NHibernate.

Tôi đã nghiên cứu SchemaExport và SchemaUpdate và tìm thấy một số vấn đề. Ví dụ, cập nhật không xóa các đối tượng db, tạo ra không null cột như nullable nếu bảng tồn tại, không tạo ra khóa chính trên nhiều-to-nhiều bảng và như vậy. Nó có nghĩa là tôi phải tái tạo db rất thường xuyên. Nhưng, về dữ liệu thì sao? Và, cách triển khai các thay đổi đối với db sản xuất và như vậy ...

Tôi muốn biết bạn có thực sự sử dụng mã đầu tiên và SchemaExport (SchemaUpdate) trong các ứng dụng của bạn không? Có thể bạn có thể cho tôi một số lời khuyên ...

Trả lời

8

Tôi sử dụng SchemaUpdate trong quá trình sản xuất. Nó là an toàn chính xác bởi vì nó không bao giờ làm các hoạt động phá hoại như xóa cột. Tuy nhiên, nó không phải là một giải pháp toàn diện để cập nhật cơ sở dữ liệu của bạn. Nếu bạn sử dụng nó, bạn sẽ vẫn phải bổ sung nó với kịch bản để cập nhật lược đồ của bạn để làm những việc như xóa (như bạn đề cập), chỉ mục, thay đổi kiểu cột, thêm dữ liệu bảng, v.v. SchemaUpdate bao gồm trường hợp 90% cho tôi.

Nhược điểm duy nhất tôi đã khám phá ra là theo thời gian, đôi khi có vẻ như đôi khi thêm các ràng buộc khóa ngoài của bản sao vào bảng của tôi.

Một điều nữa: bạn nên chạy SchemaUpdate theo cách thủ công từ công cụ xây dựng chứ không phải chính ứng dụng của bạn. Đó là không an toàn để cung cấp cho ứng dụng của bạn quyền sửa đổi lược đồ db của bạn!

2

Có, bạn có thể sử dụng chúng trong các ứng dụng thực; Tôi làm.

Tất nhiên, hầu như tất cả công việc đều diễn ra trong lần đầu tiên. Thực hành của tôi là tạo một dự án riêng biệt tham chiếu đến các ánh xạ trong assembly chính của tôi và xử lý việc tạo cơ sở dữ liệu và nhập dữ liệu ban đầu, nếu có.

Khi dự án đang được sản xuất, tôi thường bỏ dự án đó ra khỏi giải pháp, nhưng giữ nó lại để tham khảo hoặc nếu tôi cần chuyển từ tạo tập lệnh sang cập nhật tập lệnh.

Đối với cách NHibernate tạo cơ sở dữ liệu, bạn phải thực hiện một ít đặc điểm kỹ thuật hơn trong bản đồ Fluent của bạn hơn bạn có thể. Tôi muốn chỉ định null/không null, các tên ràng buộc khóa ngoài, vv .. để có quyền kiểm soát tối đa đối với cách cơ sở dữ liệu được tạo ra.

Tôi không nghĩ bạn muốn sử dụng tính năng tự động hóa trong trường hợp này.

4

Tôi sử dụng SchemaUpdate/SchemaExport để phát triển nhanh mô hình của mình, nhưng chúng không phải là thay thế cho công cụ di chuyển cơ sở dữ liệu. Như bạn đề cập, dữ liệu không thể được di chuyển một cách hợp lý trong nhiều trường hợp. Công cụ không có đủ ngữ cảnh. (ví dụ: Làm cách nào bạn có thể tự động di chuyển cột Họ tên thành FirstName/LastName?) Tôi đã trả lời một câu hỏi tương tự ở đây, nơi tôi thảo luận về các công cụ di chuyển db trong ngữ cảnh NHibernate.

NHibernate, ORM : how is refactoring handled? existing data?

1

Chỉ cần với bất kỳ mã tạo cho dù đó là thế hệ poco từ một công cụ hay hệ cơ sở dữ liệu như trong câu hỏi của bạn, nó có thể sẽ giúp bạn có được 80% con đường đó.Từ đó nó sẽ là khôn ngoan để tinh chỉnh nó 20% khác để thêm chỉ mục của bạn và bất kỳ tinh chỉnh hiệu suất khác để làm cho nó vừa phải.

Các vấn đề liên quan