Ieri leggendo le mail della ml di altnet (stavo cercando di digerire) mi sono imbattuto in una messagio del solito Ayende in merito ad una discussione su quello che di solito risulta in un "problema" per gli sviluppatori.

Nella maggior parte dei casi il problema principale, e per quanto mi riguarda posso solo confermare, è il deploy del database in maniera "sicura".

In tal senso mi sono imbattuto nella risposta di Ayende:

I use NH's SchemaExport + SQL Compare.

Con il mio fidato Google cerco SchemaExport e trovo tutto quello che mi serve, il risultato è "Ad averlo saputo prima !!!".

Provo subito a mettere in piedi una minisolution per vedere il funzionamento.

Creo due classi (Product e Category) e i relativi file di mapping.

Domain:

namespace ConsoleApplication1
{
    public class Product
    {
        public int IdProduct { get; set; }
        public string Descrizione { get; set; }
        public Category Category { get; set; }
    }

    public class Category
    {
        public int IdCategory { get; set; }
        public string Descrizione { get; set; }
    }
}

Mapping delle categorie

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="ConsoleApplication1"
                   assembly="ConsoleApplication1">
  <class name="Category" table="Category" lazy="false">

    <id name="IdCategory" column="IdCategory" type="Int32">
      <generator class="identity"/>
    </id>
    <property name="Descrizione" column="descrizione" type="string"/>
  </class>

</hibernate-mapping>

Mapping del Prodotto

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="ConsoleApplication1"
                   assembly="ConsoleApplication1">
  <class name="Product" table="Product" lazy="false">

    <id name="IdProduct" column="IdProduct" type="Int32">
      <generator class="identity"/>
    </id>
    <property name="Descrizione" column="descrizione" type="string"/>
    <many-to-one
      name="Category"
      class="Category"
      column="category"
      cascade="all"
      />
  </class>

</hibernate-mapping>

Nel mio file di configurazione metto tutto quello che serve a NHibernate per puntare ad un database di test che ho appena creato (VUOTO) per l'occasione, e nell'entrypoint della mia applicazione di test ...

            Configuration cfg = new Configuration();
            cfg.AddClass(typeof(Product));
            cfg.AddClass(typeof (Category));
            SchemaExport se = new SchemaExport(cfg);
            se.Create(true,true);

Cosa abbiamo fatto ??? Bhé, abbiamo inizializzato la configurazione di NHibernate, abbiamo aggiunto le classi Product e Category e abbiamo passato l'oggetto Configuration al costruttore di SchemaExport.

Il metodo "Create" accetta due boolean, il primo indica se effettuare la WriteLine sulla Console, il secondo se riflettere la configurazione del nostro domain su DataSource.

Abbiamo quindi due risultati (Avendo usato come parametri per il metodo create true, true):

1) Il database risulta adesso non più vuoto, ma bensì con due tabelle, lascio indovinarvi quali e come siano fatte ...

2) La nostra console mostra:

if exists (select 1 from sysobjects where id = OBJECT_ID(N'[FK1F94D86A92860A49]') AND parent_obj = OBJECT_ID('Product'))alter table Product  drop constraint FK1F94D86A92860A49
if exists (select * from dbo.sysobjects where id = object_id(N'Product') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Productif exists (select * from dbo.sysobjects where id = object_id(N'Category') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Categorycreate table Product (
  IdProduct INT IDENTITY NOT NULL,
   descrizione NVARCHAR(255) null,
   category INT null,
   primary key (IdProduct)
)
create table Category (
  IdCategory INT IDENTITY NOT NULL,
   descrizione NVARCHAR(255) null,
   primary key (IdCategory)
)
alter table Product add constraint FK1F94D86A92860A49 foreign key (category) references Category

Technorati Tags: ,