Proprietà che dovrebbe essere un campo db di sola lettura (Fluent NHibernate Automapping)
-
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?
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();
}
}