Proprietà che dovrebbe essere un campo db di sola lettura (Fluent NHibernate Automapping)

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

  •  13-12-2019
  •  | 
  •  

Domanda

Sto utilizzando Fluent NHibernate insieme alla funzionalità di mappatura automatica.Ora sto cercando qualcosa come una configurazione, un'impostazione, un attributo personalizzato, qualunque cosa, per dichiarare una proprietà di entità come "ReadOnlyFromDb"

Nel database MsSql sto utilizzando una colonna calcolata in una delle mie tabelle in cui un valore viene calcolato in base ad altri valori della riga di dati specifica.Ora ho dichiarato questa colonna nella classe di entità come

public virtual int STATUS { get; private set; }

Ottenendo i dati specifici della tabella, tutto funziona correttamente.La proprietà STATUS viene riempito correttamente con il valore specifico nel datatable.

Il problema si verifica quando provo a farlo SaveUpdate() l'oggetto specifico.Ottengo sempre l'eccezione

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

Il che è corretto per quanto ne so - ed è come avrebbe dovuto essere ;)!

Fondamentalmente sto cercando una configurazione, un'impostazione, un attributo personalizzato, qualunque cosa, da dire

Ehi Fluent NHibernate: ottieni la proprietà specifica propertyName ma non inserire/aggiornare la proprietà propertyName

C'è qualcosa del genere?Oppure esiste una soluzione alternativa per questo caso?Ho cercato nel wiki fluente di nhibernate ma non ho trovato un caso simile.

Spero che qualcuno abbia già affrontato e risolto questo problema!

Ecco lo snippet di codice su come creo la sessione (forse aiuta):

    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;
    }
}

grazie fin d'ora per la risposta - mi ha aiutato finora.Ma esiste un modo per risolvere il problema in modo più "dinamico"?

Per esempio:

Voglio dichiarare un attributo personalizzato chiamato [ReadOnlyDbField] ora dichiara tutte le proprietà dell'entità con questo attributo personalizzato per dire:Basta leggere questo valore e non aggiornarlo/inserirlo.

Fondamentalmente voglio dire nella configurazione

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

C'è un modo per implementarlo?

È stato utile?

Soluzione

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

aggiornamento:tenere conto della domanda modificata

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top