Propriété qui doit être un champ de base de données en lecture seule (Fluent NHibernate Automapping)

StackOverflow https://stackoverflow.com//questions/9699126

  •  13-12-2019
  •  | 
  •  

Question

J'utilise Fluent NHibernate avec la fonctionnalité de mappage automatique.Maintenant, je cherche quelque chose comme une configuration, un paramètre, un attribut personnalisé - peu importe - pour déclarer une propriété d'entité comme "ReadOnlyFromDb"

Dans la base de données MsSql, j'utilise une colonne calculée dans l'une de mes tables où une valeur est calculée en fonction d'autres valeurs de la ligne de données spécifique.Maintenant, j'ai déclaré cette colonne dans la classe d'entité comme

public virtual int STATUS { get; private set; }

En obtenant les données spécifiques du tableau, tout fonctionne bien.La propriété STATUS est rempli correctement avec la valeur spécifique dans le datatable.

Le problème se produit lorsque j'essaie de SaveUpdate() l'objet spécifique.J'ai toujours l'exception

A computed column cannot be the target of an INSERT or UPDATE statement

Ce qui est correct d'après ma compréhension - et c'est comme ça que c'était censé se passer ;) !

En gros, je recherche une configuration, un paramètre, un attribut personnalisé - peu importe - à dire

Hey Fluent NHibernate - obtenez la propriété spécifique propertyName mais n'insérez pas / ne mettez pas à jour la propriété propertyName

Y a-t-il quelque chose comme ça ?Ou existe-t-il une solution de contournement pour ce cas ?J'ai cherché sur le wiki nhibernate courant mais je n'ai pas trouvé de cas similaire.

J'espère que quelqu'un a déjà rencontré et résolu ce problème !

Voici l'extrait de code sur la façon dont je crée la session (peut-être que cela aide) :

    public static ISessionFactory GetNHibernateSession()
    {
        if (nhibernateSession != null)
            return nhibernateSession;

        if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty)
            throw new NullReferenceException(String.Format("AppSetting '{0}' must not be null!", msSqlConnectionString));

        //nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
        //                              .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<T_ABWEICHUNGEN>().IgnoreBase<BaseClass>)).BuildSessionFactory();

        nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
                                   .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(System.Reflection.Assembly.GetExecutingAssembly())
                                   .Override<T_ABWEICHUNGEN>(map =>map.Map(d => d.A08_STATUS_FILE).Length(2147483647))
                                   .IgnoreBase(typeof(BaseClass))
                                   .IgnoreBase(typeof(IDColumn))
                                   .IgnoreBase(typeof(MsSqlQuery))
                                   .IgnoreBase(typeof(MsSqlParamCollection))
                                   .IgnoreBase(typeof(AbweichungStatus))
                                   )).BuildSessionFactory();
        return nhibernateSession;
    }
}

merci jusqu'à présent pour la réponse - m'a aidé jusqu'à présent.Mais existe-t-il un moyen de résoudre ce problème de manière plus « dynamique » ?

Par exemple:

Je souhaite déclarer un attribut personnalisé appelé [ReadOnlyDbField] Déclarez maintenant toutes les propriétés de l'entité avec cet attribut personnalisé pour dire :Lisez simplement cette valeur et ne la mettez pas à jour/insérez-la.

En gros, je veux dire dans la configuration

Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update()

Existe-t-il un moyen de mettre en œuvre cela ?

Était-ce utile?

La solution

.Override<Entity>(map => map.Map(d => d.STATUS).Not.Insert().Not.Update())

mise à jour:compte pour la question modifiée

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top