Domanda

Utilizzando NH 2.0, ho un tipo personalizzato. Si compone di quattro proprietà, così ho implementato ICompositeUserType.

Voglio specificare le proprietà decimali di lunghezza e precisione per la stringa e nel tipo di utente, per evitare di specificare con ogni uso nei file di mapping.

Ma non c'è solo una proprietà PropertyTypes da implementare, che restituisce Io digito. La cosa divertente è, il IUserType ha una proprietà SqlTypes, <=> non lo fa.

  • Devo implementare entrambe le interfacce?
  • Devo implementare un tipo di utente per avvolgere ogni sql-tipo che voglio specificare?
  • O come posso specificare il tipo SQL per un tipo di utente composito?

Grazie mille.

È stato utile?

Soluzione 2

ho trovato la soluzione, è abbastanza semplice. Devo creare i tipi di NHibernate utilizzando il TypeFactory:

public IType[] PropertyTypes
{
  get
  {
    return new []
    {
      TypeFactory.GetDecimalType(36, 18),
      TypeFactory.GetStringType(100)
    }
  }
}

Altri suggerimenti

vi consiglio di scaricare il codice sorgente per questo tipo di scavo (NH 2,0).

In primo luogo dare un'occhiata al metodo di TypeFactory.HeuristicType, che costruisce l'istanza IType.

...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
    type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
    type = new CustomType(typeClass, parameters);
}
...

Così, se il tipo personalizzato implementa ICompositeUserType ottiene un'istanza di classe CompositeCustomType. Questo elimina la possibilità di implementare entrambe le interfacce ICompositeUserType e IUserType.

Ora diamo uno sguardo in CompositeCustomType

public override SqlType[] SqlTypes(IMapping mapping)
{
    IType[] types = userType.PropertyTypes;
    SqlType[] result = new SqlType[GetColumnSpan(mapping)];
    int n = 0;
    for (int i = 0; i < types.Length; i++)
    {
        SqlType[] sqlTypes = types[i].SqlTypes(mapping);
        for (int k = 0; k < sqlTypes.Length; k++)
        {
            result[n++] = sqlTypes[k];
        }
    }
    return result;
}

Quindi ci vogliono i tipi di ritorno da PropertyTypes e costruisce lo SQLTYPE per ogni proprietà. Ciò significa che fornire il proprio tipo di utente wrapper per ogni proprietà farà il trucco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top