Visual Studio Projekt: Umstellung BusinessApp auf 64 Bit

BA erfordert jetzt 64 Bit CPUs. Aus diesem Grund müssen auch davon abhängige Projekte umgestellt werden. Das geht unter Projekteigenschaften, Build, Platform Target. Dort umstellen auf x64.

Visual Studio Projekt: Anpassung der NLog Konfiguration in web.config

Wegen Update auf NLog 5.x muss die Konfiguration für die Server-Logdateien aktualisiert werden. Diese Befindet sich unter <nlog... in der Datei web.config des Projektes, das für die Veröffentlichung oder ZIP-Erstellung genutzt wird. Bei allen Targets mit xsi:type="File" muss die Option concurrentWrites="true" hinzugefügt werden.

Die empfohlene NLog-Standard-Konfiguration ist jetzt: Download Kundenspezifische Konfigurationen können abweichen.

Visual Studio Projekt: “Custom” Ordner beim der Veröffentlichung schützen

Um sicher zu gehen, das die “Custom” Ordner bei der Veröffentlichung der Projekte nicht entfernt werden, sollten diese Zeilen in den “csproj” Dateien ersetzt werden.

Veraltet

<AbsolutePath>/[^\\]+\\Custom</AbsolutePath>

Neu

<AbsolutePath>[\\\/][^\\\/]+[\\\/]Custom</AbsolutePath>

Zusätzlich sollte noch diese PropertyGroup ergänzt werden

<PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
</PropertyGroup>

Der Abschnitt

<PropertyGroup>
  <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
</PropertyGroup>
<Target Name="AddCustomSkipRules">
  <ItemGroup>
    <MsDeploySkipRules Include="CustomSkipFile">
      <ObjectName>filePath</ObjectName>
      <AbsolutePath>[\\\/][^\\\/]+[\\\/]Custom</AbsolutePath>
    </MsDeploySkipRules>
    <MsDeploySkipRules Include="CustomSkipFile">
      <ObjectName>dirPath</ObjectName>
      <AbsolutePath>[\\\/][^\\\/]+[\\\/]Custom</AbsolutePath>
    </MsDeploySkipRules>
  </ItemGroup>
</Target>

Datenbankabfragen mit String Vergleich

Es kann nun in programmierten Datenbankabfragen die Funktion

query.Where(ff => string.Equals(ff.Name, wert, StringComparison.CurrentCultureIgnoreCase))

verwendet werden, um sicher zu stellen, dass beim Vergleichen die Groß-/Kleinschreibung nicht berücksichtigt wird.

Analog kann mit

query.Where(ff => string.Equals(ff.Name, wert, StringComparison.CurrentCulture))

das Gegenteil erreicht werden.

Ohne diese Methode (Operator =) hängt das Ergebnis von der verwendeten Datenbank ab. MS SQL Server ist Case insensitiv und Postgres ist Case sensitiv. Aus Performancegründen wird das auch so bleiben, falls es an der jeweiligen Stelle keinen semantischen Unterschied macht, weil z.B. die Groß-/Kleinschreibung ohnehin nicht abweichen kann.

Änderungen an PostSave

Die Funktionalität ActionPostSave wird hiermit ersetzt.Die ActionPostSave Funktionalität war bisher kein Teil des Leitfadens. Falls dies in Projekten genutzt wurde, sollte die Funktionalität auf das neue Vorgehen umgestellt werden.

Die Eigenschaften ActionPostSaveClass, ActionPostSaveMethod und ActionPostSaveMethodParameters wurden in den Typen BA.Ui.Models.ActionPostSaveModel überführt, und dieses belegt nun nur noch die einzelne Eigenschaft ActionPostSave auf FormHiddenData.

  • ActionPostSaveClass -> ActionPostSaveModel.HandlerClass -> Funktionsparameter handlerClass
  • ActionPostSaveMethodParameters -> ActionPostSaveModel.Parameters -> Funktionsparameter parameters
  • ActionPostSaveMethod -> entfällt durch Verwendung des Interface-Konzepts (s. unten)
  • ActionPostSaveIncludeFormModelAndHiddenData -> entfällt durch Verwendung des Interface-Konzepts (s. unten)

Durch die Verwendung eines Interface-Konzepts ist es nun nicht mehr möglich, in einer Handler-Klasse mehrere Methoden zum Aufruf unterschiedlicher Funktionalitäten unterzubringen, Vorkommen dieser Art müssen auf mehrere Klassen aufgeteilt werden.

Umstellung RelationCategory auf GUID

Der Datentyp für Relationskategorien hat sich aus Performancegründen auf GUID geändert. Es gilt:

  • Es werden wie gehabt die GUIDs der Enum-Werte für die Relationskategorie verwendet.
  • Die Relationskategorie “keine” entspricht jetzt Guid.Empty.
  • Die Relationskategorie null bedeutet “alle” Kategorien eines Relationstyps. Das ist nur bei Selektionen erlaubt nicht beim Schreiben von Relationen.

Notwendige Änderungen zu finden hier

Attribut [CriteriaProperty] rendert nun das Eingeabesteuerlement selbst

[CriteriaProperty] fügt ein simples Formelfeld als Eingabesteuerelement ein. Das [MemoControl] Attribute muss an diesen Stellen entfernt werden, sonst wird anstelle des Formelfeldes auch weiterhin ein MemoControl gerendert.

Programmierte Teiltabellen

Programmierte Teiltablenneninstanzen, also die Verwendung innerhalb einer Tabelle, benötigen jetzt auch eine eindeutige GUID.

Bei der Klasse, die von OrmSubXXX erbt und in der das Parent-Property mit dem AssociationAttribute definiert ist, muss ein OrmSubEntityInstanceAttribute hinzugefügt werden. Jede Instanz davon benötigt eine eigene GUID, die sonst nirgends verwendet wird. Das ist die DataSource-GUID für diese Verwendung der Teiltabelle.

Beispiel:

[OrmSubEntityInstance("BD5525AB-C55C-42C9-B6E8-55F933C2C78C")]
public partial class OrmSubAddressCompany
{
    public OrmSubAddressCompany() : base() { }