Eigenschaft, die ein schreibgeschütztes Datenbankfeld sein sollte (Fluent NHibernate Automapping)

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

  •  13-12-2019
  •  | 
  •  

Frage

Ich verwende Fluent NHibernate zusammen mit der Automapping-Funktionalität.Jetzt suche ich nach etwas wie einer Konfiguration, Einstellung, einem benutzerdefinierten Attribut – was auch immer – um eine Entitätseigenschaft als „ReadOnlyFromDb“ zu deklarieren.

In der MsSql-Datenbank verwende ich eine berechnete Spalte in einer meiner Tabellen, in der ein Wert abhängig von einigen anderen Werten der spezifischen Datenzeile berechnet wird.Jetzt habe ich diese Spalte in der Entitätsklasse als deklariert

public virtual int STATUS { get; private set; }

Beim Abrufen der spezifischen Daten der Tabelle funktioniert alles einwandfrei.Die Eigenschaft STATUS wird korrekt mit dem spezifischen Wert in der Datentabelle gefüllt.

Das Problem tritt auf, wenn ich es versuche SaveUpdate() das konkrete Objekt.Ich bekomme immer die Ausnahme

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

Was für mein Verständnis richtig ist – und so sollte es auch sein ;)!

Grundsätzlich suche ich nach einer Konfiguration, Einstellung, einem benutzerdefinierten Attribut – was auch immer – um es zu sagen

Hey Fluent NHibernate – holen Sie sich die spezifische Eigenschaft propertyName aber fügen Sie die Eigenschaft nicht ein bzw. aktualisieren Sie sie nicht propertyName

Gibt es so etwas?Oder gibt es für diesen Fall einen Workaround?Ich habe das Fluent-Nhibernate-Wiki durchsucht, aber keinen ähnlichen Fall gefunden.

Ich hoffe, dass sich schon jemand diesem Problem gestellt und es gelöst hat!

Hier ist der Codeausschnitt, wie ich die Sitzung erstelle (vielleicht hilft es):

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

Vielen Dank bisher für die Antwort – hat mir bisher geholfen.Aber gibt es eine Möglichkeit, das Problem „dynamischer“ zu lösen?

Zum Beispiel:

Ich möchte ein benutzerdefiniertes Attribut namens deklarieren [ReadOnlyDbField] Deklarieren Sie nun alle Eigenschaften der Entität mit diesem cusomt-Attribut, um Folgendes zu sagen:Lesen Sie diesen Wert einfach ab und aktualisieren/fügen Sie ihn nicht ein.

Grundsätzlich möchte ich in der Konfiguration sagen

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

Gibt es eine Möglichkeit, dies umzusetzen?

War es hilfreich?

Lösung

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

aktualisieren:Konto für bearbeitete Frage

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top