J'ai trouvé un (désordre) façon d'obtenir ce travail:
public class NullEventListener : IPreUpdateEventListener, IPreInsertEventListener, IPreLoadEventListener
{
#region IPreInsertEventListener Members
public bool OnPreInsert(PreInsertEvent preInsertEvent)
{
var instance = preInsertEvent.Entity as MyTable;
if (instance == null)
return false;
if (instance.Parent == null)
Set(preInsertEvent.Persister, preInsertEvent.State, "Parent", string.Empty);
return false;
}
#endregion
#region IPreLoadEventListener Members
public void OnPreLoad(PreLoadEvent preLoadEvent)
{
var instance = preLoadEvent.Entity as MyTable;
if (instance == null)
return;
try
{
// this is really messy!!
var parent = Get(preLoadEvent.Persister, preLoadEvent.State, "Parent") as MyTable;
if (parent == null || parent.ID == "")
throw new Exception("Set to null");
}
catch (Exception)
{
Set(preLoadEvent.Persister, preLoadEvent.State, "Parent", null);
}
return;
}
#endregion
#region IPreUpdateEventListener Members
public bool OnPreUpdate(PreUpdateEvent preUpdateEvent)
{
var instance = preUpdateEvent.Entity as MyTable;
if (instance == null)
return false;
if (instance.Parent == null)
Set(preUpdateEvent.Persister, preUpdateEvent.State, "Parent", string.Empty);
return false;
}
#endregion
private static void Set(IEntityPersister persister, object[] state, string propertyName, object value)
{
int index = Array.IndexOf(persister.PropertyNames, propertyName);
if (index == -1)
return;
state[index] = value;
}
private static object Get(IEntityPersister persister, object[] state, string propertyName)
{
int index = Array.IndexOf(persister.PropertyNames, propertyName);
if (index == -1)
return null;
return state[index];
}
}
Merci et salutations, forki
J'ai essayé ceci. Mais malheureusement, je n'ai pas eu ce travail. Dois-je implémenter IUserType pour la classe MyTable? – forki23
Votre classe de domaine ne devrait pas implémenter l'interface IUserType, mais plutôt créer une classe de type d'utilisateur distincte dans la couche d'accès aux données, qui sera ensuite utilisée dans le mappage. De cette façon, votre couche de domaine n'aura pas besoin des données couche d'accès. Pour spécifier les types d'utilisateur dans le mappage NHibernate Fluent, utilisez la méthode .CustomTypeIs(). –
IUserType est définitivement la solution. Créer une implémentation de cette interface séparée de tout le reste, qui sera utilisée pour transformer des chaînes vides en chaînes vides et vice-versa. Vous spécifiez ensuite cette implémentation dans vos mappings courants en utilisant CustomTypeIs comme Erik l'a montré. –