2009-05-27 39 views
17

Tôi đang sử dụng NHibernate với FluentNHibernate cho DAL của tôi. Tôi cũng đang sử dụng SchemaExportSchemaUpdate để tạo và cập nhật giản đồ cơ sở dữ liệu của mình.Có thể tạo cơ sở dữ liệu bằng NHibernate không?

Vấn đề của tôi là các hoạt động lược đồ đều yêu cầu cơ sở dữ liệu tồn tại trước khi chúng hoạt động. Tôi muốn lập trình tạo cơ sở dữ liệu của mình và cập nhật lược đồ vì có thể có nhiều cơ sở dữ liệu và việc tạo cơ sở dữ liệu không chỉ là một hoạt động một lần.

Tôi biết tôi có thể làm điều này bằng tay bằng cách thực hiện lệnh tạo cơ sở dữ liệu trên kết nối với cơ sở dữ liệu chính, nhưng điều này cảm thấy sai khi xem xét sử dụng NHibernate cho tất cả các tương tác cơ sở dữ liệu của tôi. Là một sang một bên, tôi sử dụng một cơ sở dữ liệu inmemory SQLite cho các bài kiểm tra đơn vị của tôi vì vậy bất kỳ sql tôi viết sau đó sẽ phải biết tôi đang sử dụng cơ sở dữ liệu nào.

Có cách nào để NHibernate tạo cơ sở dữ liệu cho tôi không?

Trả lời

1

Hãy xem RhinoCommons. Dưới Rhino.Commons.ForTesting, trong UnitOfWorkTestContextDbStrategy.cs, Ayende đã thực hiện một số thường trình ở đó tạo cơ sở dữ liệu.

+0

Cảm ơn, tôi sẽ sử dụng điều này, nó không thực sự những gì tôi muốn (NHibernate làm việc) nhưng nó khá mát mẻ. Tôi đã rất ngạc nhiên khi thấy một tài liệu tham khảo máy chủ db "(cục bộ)" :-) – Andrew

1

Hmm, bạn thực sự có thể sử dụng SchemaExport như bạn đề cập, nhưng tôi thấy NHibernate thô sơ như một cách để thu hẹp khoảng cách giữa mô hình miền OO và lưu trữ liên tục lưu trữ. Đó là, với tôi mục đích NHibernate là để tồn tại và lấy các thực thể trong mô hình miền của tôi.

Khi bạn muốn cập nhật giản đồ, bạn không nên sử dụng NHibernate (nếu có thể), vì đó không phải là mục đích của NHibernate; có một 'ngôn ngữ cụ thể tên miền' được gọi là SQL :) đó là tốt lúc làm những việc đó. Để tạo cơ sở dữ liệu và cập nhật lược đồ cơ sở dữ liệu của tôi, tôi sử dụng Migrator.NET, một khung công tác cho phép bạn viết các lớp C# ở nơi bạn chỉ định những gì cần thực hiện (tạo một bảng, thêm một cột, v.v ...).
Lợi thế của điều này, là Migrator.NET cũng hỗ trợ nhiều DBMS, vì vậy bạn không kết thúc bằng văn bản DB-cụ thể mã SQL.

+0

Cảm ơn, tôi đang gặp một cái nhìn tại Migrator.Net, trông khá mát mẻ, mặc dù nó không giải quyết của tôi vấn đề thực sự tạo cơ sở dữ liệu. – Andrew

12

Tôi nghĩ rằng việc tạo db với NHibernate là tốt đẹp, nếu bạn bắt đầu phát triển ứng dụng với mô hình miền. Ý tôi là - nó cung cấp cho một cái nhìn sâu sắc như thế nào db của bạn nên xem xét. Nhưng nói chung - kịch bản sql nên được sử dụng.

Tôi nghe nói rằng một số nhà phát triển sử dụng thế hệ db NHibernate cho các bài kiểm tra tích hợp, họ tạo db sqlite nhẹ trên bay.

Cách tạo db bằng NHibernate? Đây là cách tôi làm điều đó:

public static void InitSessionFactory() 
    { 
     var connectionString = 
      ConfigurationManager 
       .ConnectionStrings["MyConnectionString"] 
       .ConnectionString; 

     var cfgFromXml = new Configuration(); 
     cfgFromXml.Configure(); 

     var cfg = Fluently.Configure(cfgFromXml) 
      .Database(MsSqlConfiguration.MsSql2005 
          .ConnectionString(x => x.Is(connectionString)) 
          .UseReflectionOptimizer()) 
      .Mappings(x => x.FluentMappings 
           .AddFromAssemblyOf<NHibernateBootstrapper>()) 
      .ExposeConfiguration(BuildSchema); 


     ObjectFactory.Inject(cfg.BuildSessionFactory()); 
    } 

    private static void BuildSchema(Configuration config) 
    { 
     //Creates database structure 
     //new SchemaExport(config) 
     // .Create(false, true); 
    } 
9

Không, NHibernate sẽ không tạo cơ sở dữ liệu cho bạn. Tạo cơ sở dữ liệu là thứ bạn thường không muốn làm khi đang di chuyển. Nó cần nhiều tham số cấu hình và đây là cơ sở dữ liệu rất cụ thể, thậm chí là phiên bản cơ sở dữ liệu cụ thể.

Đối với sản phẩm của chúng tôi, tôi đã viết một lớp thiết lập cơ sở dữ liệu. Nó được sử dụng cho trình cài đặt, các bài kiểm tra tích hợp và công cụ bảo trì cơ sở dữ liệu.

  • NHibernate tạo kết nối bằng cấu hình của nó.
  • việc triển khai của riêng tôi sẽ tạo cơ sở dữ liệu. Có các cách triển khai khác nhau cho các phương ngữ khác nhau.
  • NH tạo ra các bảng và các đối tượng cơ sở dữ liệu khác
  • lớp Installer tạo dữ liệu ban đầu

Ngoài ra còn có một trường hợp đặc biệt, nơi mà khách hàng không muốn cấp quyền tạo cơ sở dữ liệu. Sau đó, chúng tôi hy vọng anh ta làm điều đó và bỏ qua phần này.

+2

Tạo cơ sở dữ liệu SqlCe chỉ cần một dòng mã: new SqlCeEngine (string.Format ("Data Source = '{0}';", path)).Tạo nên cơ sở dữ liệu(); – HappyNomad

+1

Có, việc tạo một cơ sở dữ liệu máy chủ sql sử dụng cấu hình mặc định không phức tạp hơn. Nhưng đây không phải vấn đề. NH không làm điều đó bởi vì nó sẽ có ý nghĩa nhiều. –

+0

Điều này không chính xác nữa. Với NH3 bạn có thể sử dụng hbm2ddl như một phần của không gian tên NHibernate.Tool – Dann

5

Chúng tôi sử dụng SchemaExport để cung cấp lược đồ và tác vụ Nant để thả và tạo lại cơ sở dữ liệu. Một nhiệm vụ Nant khác chạy lược đồ xuất khẩu và mã tải dữ liệu tồn tại dưới dạng một phép thử tích hợp được chạy bởi nhiệm vụ nunit. Có một số sample here.

+1

+1 Yepm chỉ cần sử dụng (new SchemaExport (cfg)). Công việc hoàn thành. –

+0

Mã này dường như đã chuyển sang http://codecampserver.codeplex.com/SourceControl/changeset/view/4755c1386bff#nant.build – synhershko

0

Looking for này bản thân mình như tôi đã nhìn thấy nó thực hiện trong java - câu hỏi tương tự ở đây: Generate Database from NHibernate config files

+0

Câu hỏi này là tạo cơ sở dữ liệu chứ không phải bảng. –

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