2011-11-02 7 views
9

Ho modello di entità che voglio essere riflessa per database ogni volta che corro applicazione, ma senza cancellare i dati così sto usando SchemaUdpate con fluente metodo mappature NHibernate in modoCome modificare la colonna utilizzando la funzionalità SchemaUpdate NHibernate

var config = Fluently.Configure().Database 
(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)); 
//here I add mappings , apply conventions, build configuration, etc... 
// 
new SchemaUpdate(configuBuild).Execute(doUpdate: true, script: true); 

Quindi il mio modello di entità viene aggiornato correttamente quasi tutto il tempo. Il problema è che quando si modifica la definizione di una struttura, diciamo avevo tale proprietà

[CustomSqlType("nvarchar(400)")] 
public virtual string Name { get; set; } 

CustomSqlType è solo un attributo che verrà applicato da un certo convenzione quando mapping vengono caricati. In questo caso, la proprietà Name verrà creata come campo nvarchar(400). Ma se in futuro a cambiare la definizione di questo

[CustomSqlType("nvarchar(500)")] 
public virtual string Name { get; set; } 

di file di hbm.xml corretta sarebbe generato (mezzi corretta nvarchar (500)), ma la colonna nel database non viene aggiornato se tale evento è valido alter dalla prospettiva db. E 'possibile modificare la colonna esistente (generare alter script) con un nuovo vincolo lunghezza/precisione/nullable usando SchemaUpdate?

risposta

9

Va bene ho scoperto che è impossibile, qui di seguito c'è il codice eseguito da SchemaUpdate

foreach (Column column in ColumnIterator) 
     { 
      IColumnMetadata columnInfo = tableInfo.GetColumnMetadata(column.Name); 
      if (columnInfo != null) 
      { 
       continue; 
      } 

      // the column doesnt exist at all. 
      // other not important code 
     } 

Come si vede non si fa nulla per impostazione predefinita se esiste la colonna.

+0

Che puzza davvero. Cosa hai finito per forzare un aggiornamento sul tuo schema? – Mithon

+0

grazie! Ho passato anni a cercare di scoprire perché non sembra aggiornare i miei limiti predefiniti! - Sei riuscito a trovare una soluzione alternativa? – Zack

Problemi correlati