NHibernate Fluent cascade delete ne fonctionne pas
J'ai un téléphone simple répertoire app à l'aide de Fluent NHibernate 1.1. Dans l'application, une "Personne" objet a beaucoup de "Numéro de téléphone" des objets. J'essaie de supprimer une Personne et je veux les suppressions en cascade à PhoneNumbers. J'ai mis une convention de DefaultCascade.All()
après la lecture de cette réponse. Cependant, la tentative de suppression de l'objet parent encore déclenche une exception--il semble que NHibernate est d'essayer de mettre à jour la table enfant pour définir l'ID parent à null au lieu de simplement supprimer l'enregistrement:
{"impossible de supprimer la collecte: [Personne.PhoneNumbers#473][SQL: mise à JOUR phone_numbers ENSEMBLE person_id = null OÙ person_id = @p0]"}
InnerException:
{"Impossible d'insérer la valeur NULL dans la colonne "person_id", table 'annuaire.dbo.phone_numbers'; la colonne n'autorise pas les valeurs null. Mise à JOUR échoue.\r\nle instruction a été arrêtée."}
Mon Couramment config est:
public static ISessionFactory CreateSessionFactory() {
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["activeConnStr"]].ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()
.Conventions.Add(DefaultCascade.All())
)
.BuildSessionFactory();
}
La classe parente est:
public class Person {
public Person() {
PhoneNumbers = new List<PhoneNumber>();
EmailAddresses = new List<string>();
}
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Company { get; set; }
public virtual IList<PhoneNumber> PhoneNumbers { get; set; }
public virtual IList<string> EmailAddresses { get; set; }
}
L'enfant de la classe (Numéro de téléphone) est:
public class PhoneNumber {
public virtual string Number { get; set; }
public virtual PhoneNumberType NumberType { get; set; }
public virtual Person Person { get; set; }
}
Mon code pour supprimer une personne est:
public static void DeletePerson(int id) {
using (var session = Dalc.Instance.SessionFactory.OpenSession()) {
using (var trans = session.BeginTransaction()) {
session.Delete(session.Load<Person>(id));
trans.Commit();
}
}
}
Ce que je fais mal?
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de la configuration de la fluidité de la partie, mais j'ai récemment eu le même problème avec ActiveRecord.
Vous devez définir votre association, sur la Personne de côté, comme
Inverse = true
.En regardant le Prise En Main documentation...
Je belive, vous devez définir ce paramètre lors de la définition de votre HasMany relation en Personne. Il devrait ressembler à quelque chose comme ceci:
Invserse
. J'attendrais la mère de propre l'enfant, mais ce n'est pas le cas ici.Il fonctionne; Voici ce que chaque option cascade signifie:
aucun - ne pas faire de cascades, de laisser les utilisateurs les traite par eux-mêmes.
save-update - lorsque l'objet est enregistrée/mise à jour, vérifiez les associations et les enregistrer/mettre à jour n'importe quel objet qui en ont besoin (y compris les enregistrer/mettre à jour les associations plusieurs-à-plusieurs scénario).
supprimer - lorsque l'objet est supprimé, supprimer tous les objets de l'association.
delete-orphan - lorsque l'objet est supprimé, supprimer tous les objets de l'association. En outre, lorsqu'un objet est retiré de l'association et n'est pas associé avec un autre objet (orphelins), aussi le supprimer.
tous - lorsqu'un objet est enregistrer/mettre à jour/supprimer, vérifier les associations et les enregistrer/mettre à jour/supprimer tous les objets trouvés.
all-delete-orphan - lorsqu'un objet est enregistrer/mettre à jour/supprimer, vérifier les associations et les enregistrer/mettre à jour/supprimer tous les objets trouvés. En plus du fait que, lorsqu'un objet est retiré de l'association et n'est pas associé avec un autre objet (orphelins), aussi le supprimer.
cascade
options que j'ai vu. Merci!