Question

Je pense avoir un problème avec les mappages Fluent NHibernate, et je ne peux pas vraiment dire au juste comment je devrais le configurer pour éviter un problème.

J'ai un objet métier (littéralement, une "entreprise") et un objet de révision. Chaque entreprise peut avoir plusieurs avis créés sur une page de l'interface utilisateur. L’entreprise est une propriété de la Revue, comme suit:

public class Business 
{
    public virtual int BusinessId {get;set;}
    public virtual DateTime LastModified {get;set;}
    public virtual IList<Review> Reviews {get;set;}

    [... more removed for brevity ...]

}

public class Review
{
    public virtual int ReviewId {get;set;}
    public virtual string ReviewText {get;set;}
    public virtual Business Business {get;set;}

    [... more removed for brevity ...]

}

Mes mappages sont les suivants:

public class ReviewMap : ClassMap<Review>
{
    public ReviewMap()
    {
        WithTable("Reviews");
        Id(x => x.ReviewId).TheColumnNameIs("ReviewId").GeneratedBy.Identity();

        References(x => x.Business).TheColumnNameIs("BusinessId");

        Map(x => x.ReviewText);

       [... and so on...]
}


public class BusinessMap : ClassMap<Business>
{
    public BusinessMap()
    {
        WithTable("Businesses");

        Id(x => x.BusinessId).TheColumnNameIs("BusinessId").GeneratedBy.Identity();

        Map(x => x.Name).TheColumnNameIs("BusinessName");
        Map(x => x.LastModified, "LastModifiedOn");

        HasMany<Review>(x => x.Reviews)
            .Inverse()
            .LazyLoad();

        [... more removed for brevity ...]

    }
}

Le code du référentiel est

public void Save(T entity)
    {
        using (ISession session = GetSession())
        using (ITransaction tx = session.BeginTransaction())
        {
            session.SaveOrUpdate(entity);
            tx.Commit();
        }
    }

Dans le code, j'attribue les propriétés à l'objet Review et appelle la méthode Save du référentiel.

Le problème est que, comme je ne mets pas à jour l'entreprise en tant que telle, je ne m'attends pas à ce qu'elle soit sauvegardée - tout ce que je veux, c'est la critique sauvegardée. Mais le code tente également de sauver l'entreprise, et je reçois une exception, car je n'ai pas défini l'option "LastModified". propriété - je ne veux pas non plus, car je garde la REVIEW, pas l'entreprise.

Comment dois-je configurer le mappage pour que cela se produise?

Était-ce utile?

La solution 2

Ok, le problème était le suivant: la propriété LastModified de l'entreprise n'était pas définie dans l'objet métier réel, car la base de données permettait la valeur NULL pour cette propriété.

Cela veut dire que lorsque j'ai essayé de sauvegarder la révision, l'entreprise a également essayé de sauvegarder l'entreprise. Probablement parce qu'elle reconnaissait que l'objet de base de données n'avait aucune valeur (null) pour LastModified, mais par défaut, LastModified est DateTime, sa valeur était DateTime.MinValue.

Une fois que j'ai mis à jour la table métier de la base de données de sorte que LastModified soit maintenant NOT NULL, cela fonctionne.

Ce qui est malheureux, c’est que les données sur lesquelles je travaillais sont entrées dans cet état sans que cela soit un problème.

Autres conseils

Il se peut que le problème vienne d'une exigence essentielle d'inclusion entre l'entreprise et l'examen. L’entreprise (parent) doit généralement être enregistrée avant que la révision (enfant) puisse l’être.

Pourriez-vous inclure le mappage de votre objet métier si cela ne vous aide pas?

Comme je ne peux pas encore commenter, je posterai ici.

Si vous souhaitez que la colonne LastModified soit nullable, la propriété correspondante doit être DateTime? plutôt qu'un simple DateTime .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top