2009-06-15 37 views
8

Vì vậy, người dùng mới NHibernate; cố gắng quấn quanh não tôi.NHibernate có thể kiểm tra xem lược đồ db đã được tạo chưa?

Tôi đang dự tính cách xử lý triển khai và sau đó thêm các tiện ích vào ứng dụng web (có thể yêu cầu các lớp kiên trì của riêng chúng). Tôi đã nghĩ rằng việc sử dụng SchemaExport cho việc triển khai sẽ hoạt động khá tốt, nhưng tôi đã tự hỏi nếu có một cách quá NHibernate nhận được để cho tôi biết một cách phổ biến, dựa trên mã mà một xuất khẩu giản đồ đã được thực hiện, hoặc không phải. Về cơ bản, tôi muốn làm smething như trong giả này:

if(!_cfg.HasSchemaForType(typeof(MyType)) 
     ExportSchema(typeof(MyType)); 
    else 
     UpdateSchema(typeof(MyType)); 

nơi hai chức năng sẽ sử dụng trong nội bộ SchemaExport hoặc SchemaUpdate, tương ứng.


EDIT: Guys, tôi đánh giá cao câu trả lời cho đến nay, nhưng họ thiếu điểm một chút. Những gì tôi đang cố gắng thiết lập là một cách để ứng dụng cho phép bổ sung và loại bỏ các phần bổ sung có thể yêu cầu thay đổi đối với db. Tôi không nói về việc phiên bản mã của riêng tôi hoặc tương tự (ít nhất, không phải là chức năng chính của nó). Vì vậy, câu hỏi là ít hơn về khi tôi triển khai các ứng dụng, và nhiều hơn nữa về khi tôi thêm hoặc loại bỏ một plug-in. Có plugin theis (do đó kiểm tra kiểu mã giả) đã được triển khai trước đó chưa? Nếu có, hãy chạy bản cập nhật. Nếu không, hãy chạy xuất. Có lý?

Trả lời

3

Không, NHibernate không làm những gì bạn đang yêu cầu. Tôi tưởng tượng nó sẽ có thể viết một số mã đã xuất khẩu lược đồ và sau đó so sánh nó với lược đồ cơ sở dữ liệu. Nhưng có lẽ sẽ dễ dàng hơn để xuất vào cơ sở dữ liệu tạm thời và sử dụng công cụ của bên thứ 3, chẳng hạn như so sánh SQL của redgate, để so sánh các lược đồ.

Ngay cả khi nó đã làm những gì bạn đang yêu cầu, tôi không thấy cách đó sẽ giúp triển khai vì mục đích của nó là tạo cơ sở dữ liệu từ đầu.

Edited thêm: Giả sử mỗi plugin đã thiết lập riêng của mình các bảng, bạn có thể xác định xem giản đồ đã được triển khai sử dụng một trong những phương pháp:

  • Cố gắng để tải một trong những đối tượng plugin và bắt ngoại lệ.
  • Kiểm tra giản đồ cơ sở dữ liệu (sử dụng SMO cho SQL Server) để kiểm tra xem bảng có tồn tại hay không.
  • Tạo bản ghi trong bảng khi plugin được triển khai.
+1

Không cố gắng giải quyết vấn đề triển khai ứng dụng. Tôi đã thêm một số ghi chú bổ sung để làm rõ. Cám ơn phản hồi của bạn! – Paul

+0

Tôi không nghĩ rằng anh ta có nghĩa là tại thời gian triển khai ... điều này sẽ phải ở thời gian chạy hoặc thời gian khởi tạo ... các plug-in sẽ phải chịu trách nhiệm về sự phụ thuộc của riêng họ. – Webjedi

+0

Cảm ơn; Tôi đánh dấu của bạn là 'trả lời' vì nó là hoàn chỉnh nhất. Tôi nghĩ rằng có một mối quan tâm riêng biệt mà theo dõi các plugin đã được triển khai có lẽ là con đường tốt nhất để đi, như bạn đề nghị trong viên đạn thứ ba của bạn. – Paul

0

Nếu bạn có VS Team Suite hoặc phiên bản Nhà phát triển cơ sở dữ liệu, nó có thể đồng bộ hóa và theo dõi các thay đổi và sau đó thực hiện tập lệnh triển khai sẽ tạo tất cả các đối tượng phù hợp với bạn. Ngoài ra RedGate có một sản phẩm so sánh Schema mà làm điều tương tự nếu tôi không nhầm.

+0

Tôi không có phiên bản nào của VS, nhưng tôi không cố gắng quản lý điều này ở cấp nhà phát triển; mục đích là xây dựng một ứng dụng có thể điều khiển được mà quản trị viên có thể thêm/xóa các plugin. – Paul

2

Mục đích của việc xuất giản đồ là tạo lược đồ hoàn chỉnh từ đầu. Thực sự hữu ích nếu bạn chưa triển khai ứng dụng của mình.

Sau lần triển khai đầu tiên, tôi thực sự khuyên bạn nên sử dụng công cụ di chuyển sẽ giúp bạn mở rộng/sửa đổi thêm lược đồ. Nếu bạn nghĩ xa hơn một chút, bạn sẽ nhận thấy rằng bạn thậm chí yêu cầu thao tác dữ liệu (ví dụ: xóa dữ liệu sai đã được tạo ra do lỗi) khi ứng dụng của bạn phát triển. Đó là tất cả công cụ di chuyển có thể giúp bạn.

Hãy xem thành:

Dưới đây là danh sách các công cụ chuyển đổi hơn cho .net đã trả lời trong một câu hỏi SO:

Nguồn gốc ý tưởng về di cư bắt nguồn từ Ruby on Rails và đã được "nhân bản" thành các khung công tác khác trong quá khứ. Đó là lý do tại sao nó chắc chắn là tốt để đọc về ý tưởng ban đầu tại http://guides.rubyonrails.org/migrations.html quá.

+0

Phải, tôi biết sự khác biệt giữa SchemaExport và SchemaUpdate; đó là lý do tại sao tôi muốn có thể phát hiện nếu tập lệnh ban đầu đã được chạy. – Paul

16

Tôi nghĩ rằng những gì bạn đang tìm kiếm là SchemaUpdate.Execute thay vì sử dụng SchemaExport. SchemaUpdate sẽ tạo giản đồ nếu nó chưa tồn tại hoặc cập nhật nếu được yêu cầu và mong muốn.

Điều đó phù hợp với tôi khi sử dụng cả MSSQL và SQLite.

new SchemaUpdate(config).Execute(false, true); 
9

Có có, trong ít nhất 3,0

public static bool ValidateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg); 
    try 
    { 
     myvalidator.Validate(); 
     myvalidator = null; 
     return true; 
    } 
    catch (Exception ex) 
    { 
     MsgBox(ex.Message, "Schema validation error"); 
    } 
    finally 
    { 
     myvalidator = null; 
    } 

    return false; 
} 

Đối với phần cập nhật, làm.

public static void UpdateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg); 
    schema.Execute(false, true); 
    schema = null; 
} // UpdateSchema 
Các vấn đề liên quan