2012-11-20 4 views
2

Я работаю с NHibernate + свободно, у меня есть этот кодКак добавить определенный файл .hbm.xml в NHibernate конфигурации для использования в экспортной схеме

FluentConfiguration fc = Fluently.Configure() 
      .Database(MySQLConfiguration.Standard.ConnectionString(connectionString).ShowSql() 
      .Dialect<NHibernate.Dialect.MySQL5Dialect>().Driver<NHibernate.Driver.MySqlDataDriver>()) 
      .Mappings(m => m.FluentMappings 
       .AddFromAssemblyOf<UsuarioMap>() 
       .Conventions.Add(PrimaryKey.Name.Is(a => string.Concat("Id", a.EntityType.Name))) 
       .Conventions.Add(ForeignKey.Format((x, y) => string.Concat("Id", y.Name)))) 
      .ExposeConfiguration(BuildSchema); 

Это добавляет отображения из моих файлов карт, позже я использую выставленную конфигурацию для экспорта схемы

Теперь мне нужно добавить конкретный файл .hbm.xml, чтобы создать триггер в моем db, и я не знаю, как, я уже написал файл .hbm.xml, он выглядит таких как

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <database-object> 
    <create> 
    CREATE TRIGGER borradoUsuario BEFORE DELETE ON activaciones 
    FOR EACH ROW BEGIN set @idUsuario = OLD.IdUsuario; 
    SELECT IdHistorialEstado FROM Usuarios WHERE IdUsuario = @idUsuario INTO @IdHistorial; 
    SELECT IdDomicilio FROM Usuarios WHERE IdUsuario = @idUsuario INTO @idDomicilio; 
    DELETE FROM usuarios WHERE IdUsuario = @idUsuario; 
    DELETE FROM domicilios WHERE IdDomicilio = @IdDomicilio; 
    DELETE FROM historialestado WHERE IdHistorialEstado = @idHistorial; 
    DELETE FROM detallehistorialestado WHERE idHistorialEstado = @idHistorial; 
    DELETE FROM inmobiliarias WHERE IdInmobiliaria = @idUsuario; 
    DELETE FROM particulares WHERE IdParticular = @idUsuario; 
    DELETE FROM moderadores WHERE IdModerador = @idUsuario; 
    END 
</create> 

<drop> 
</drop> 

я надеюсь, что я получить некоторую помощь здесь =/

я перейти на другой ПОДХОД, нет у меня есть класс, который простирается от AbstractAuxiliaryDatabaseObject, он знает создавать и удалять скрипты:

public class BorradoUsuarioTrigger : AbstractAuxiliaryDatabaseObject{ 

    public override string SqlCreateString(Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema){ 
//The drop is important, because the shema export calls and executes this twice. 


    return @" 
     DROP TRIGGER IF EXISTS borradoUsuarioTrigger; 
     DELIMITER $$ 
     CREATE TRIGGER borradoUsuarioTrigger BEFORE DELETE ON activaciones FOR EACH ROW 
     BEGIN 
      DECLARE idHist INTEGER; 
      DECLARE idDom INTEGER; 
      SET idHist = (SELECT IdHistorialEstado FROM Usuarios WHERE IdUsuario = OLD.IdUsuario); 
      SET idDom = (SELECT IdDomicilio FROM Usuarios WHERE IdUsuario = OLD.IdUsuario); 
      DELETE FROM domicilios WHERE IdDomicilio = @idDom; 
      DELETE FROM historialestado WHERE IdHistorialEstado = @idHist; 
      DELETE FROM detallehistorialestado WHERE idHistorialEstado = @idHist; 
      DELETE FROM inmobiliarias WHERE IdInmobiliaria = OLD.idUsuario; 
      DELETE FROM particulares WHERE IdParticular = OLD.idUsuario; 
      DELETE FROM moderadores WHERE IdModerador = OLD.idUsuario; 
      DELETE FROM usuarios WHERE IdUsuario = OLD.idUsuario; 
     END$$"; 
    } 

    public override string SqlDropString(Dialect dialect, string defaultCatalog, string defaultSchema){ 
    return @"DROP TRIGGER IF EXISTS borradoUsuarioTrigger"; 
    } 

    public void AddDialectScope(string dialectName){ 
    throw new NotImplementedException(); 
    } 

    public bool AppliesToDialect(Dialect dialect){ 
    return true; 
    } 

    public void SetParameterValues(IDictionary<string, string> parameters){ 
    base.SetParameterValues(parameters); 
    } 
} 

я думаю, что я близок к тому, что мне нужно, но это все еще не работает, я получаю следующее сообщение в наиболее глубоком исключением:

"Parameter @idDom must be defined" 

Я думаю, это потому, что я пытаюсь вернуть жестко закодированную строку для скрипта sql create, но я не знаю, может ли кто-нибудь мне помочь?

+0

Mybe это может помочь вам понять, это: http://stackoverflow.com/questions/9916222/creating-sqlite-trigger-via-nhibernate – Jester

+0

еще не решился = / –

ответ

1

, наконец, получил ответ:

класс, который знает SQL скрипты выглядит следующим образом

public class BorradoUsuarioTrigger : AbstractAuxiliaryDatabaseObject 
{ 
    public override string SqlCreateString(Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema){ 
    //The drop is important, because the shema export calls and executes this twice. 
    this.Parameters.Add("idHist", "(SELECT IdHistorialEstado FROM Usuarios WHERE IdUsuario = OLD.IdUsuario)"); 
    this.Parameters.Add("idDom", "(SELECT IdDomicilio FROM Usuarios WHERE IdUsuario = OLD.IdUsuario)"); 

    StringBuilder builder = new StringBuilder(); 

    builder.AppendLine("DROP TRIGGER IF EXISTS borradoUsuarioTrigger;"); 
    builder.AppendLine("CREATE TRIGGER borradoUsuarioTrigger BEFORE DELETE ON activaciones FOR EACH ROW "); 
    builder.AppendLine("BEGIN "); 
    builder.AppendLine("DELETE FROM domicilios WHERE IdDomicilio = " + this.Parameters["idDom"] + "; "); 
    builder.AppendLine("DELETE FROM historialestado WHERE IdHistorialEstado = " + this.Parameters["idHist"] + "; "); 
    builder.AppendLine("DELETE FROM detallehistorialestado WHERE idHistorialEstado = " + this.Parameters["idHist"] + "; "); 
    builder.AppendLine("DELETE FROM inmobiliarias WHERE IdInmobiliaria = OLD.idUsuario; "); 
    builder.AppendLine("DELETE FROM particulares WHERE IdParticular = OLD.idUsuario; "); 
    builder.AppendLine("DELETE FROM moderadores WHERE IdModerador = OLD.idUsuario; "); 
    builder.AppendLine("DELETE FROM usuarios WHERE IdUsuario = OLD.idUsuario; "); 
    builder.AppendLine("END "); 

    return builder.ToString(); 
    } 

    public override string SqlDropString(Dialect dialect, string defaultCatalog, string defaultSchema) 
    { 
     return @"DROP TRIGGER IF EXISTS borradoUsuarioTrigger"; 
    } 

    public void AddDialectScope(string dialectName) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool AppliesToDialect(Dialect dialect) 
    { 
     return true; 
    } 

    public void SetParameterValues(IDictionary<string, string> parameters) 
    { 
     base.SetParameterValues(parameters); 
    } 
} 

и свободно настроить выглядит следующим образом:

 FluentConfiguration fc = Fluently.Configure() 
      .Database(MySQLConfiguration.Standard.ConnectionString(connectionString).ShowSql() 
      .Dialect<NHibernate.Dialect.MySQL5Dialect>().Driver<NHibernate.Driver.MySqlDataDriver>()) 
      .Mappings(m => m.FluentMappings 
       .AddFromAssemblyOf<UsuarioMap>() 
       .Conventions.Add(PrimaryKey.Name.Is(a => string.Concat("Id", a.EntityType.Name))) 
       .Conventions.Add(ForeignKey.Format((x, y) => string.Concat("Id", y.Name)))) 
      .ExposeConfiguration(conf => conf.AddAuxiliaryDatabaseObject(new BorradoUsuarioTrigger())) 
      .ExposeConfiguration(BuildSchema);