- Inline-Attachments gehören jetzt immer zu genau einem HTML-Feld in der Datentabelle.
Dessen Feldname steht jetzt analog zu normalen Attachments in der SpalteOrmAttachment.Category
. - Die
ContentID
eines Inline-Attachments ist kein starker Schlüssel.
Diese kann aus Fremdsystemen kommen und durch Copy&Paste in verschiedenen Datensätzen und/oder verschiedenen HTML-Feldern gleich sein. Zwar sollten gemäß RFC2392 Content-IDs weltweit eindeutig sein und daher immer auf denselben Content verweisen, das gilt aber nicht für die Leserechte des Datensatzes in BA, wenn z.B. eine Termineinladung in Kalender mehrerer Benutzer repliziert wird. - Für den Zugriff auf Inline-Attachments muss jetzt immer
OrmAttachments.Oid
verwendet werden. Diese steht jetzt auch im HTML in der Datenbank. Syntax:img src="cid:AttachmentOID"
- Die Eigenschaft
OrmAttachment.IsInline
existiert nicht mehr.
Da jedes Attachment notwendigerweise zu genau einem Feld = einer Kategorie gehört und diese auch für den Zugriff erforderlich ist, ist die EigenschaftIsInline
immer inhärent eindeutig. Immer wenn die Kategorie ein HTML-Feld ist, ist es notwendigerweise ein Inline-Attachment und vice versa. - Die Zuweisung von HTML mit Inline-Images zu anderen Datensätzen und/oder Datenspalten ist jetzt direkt möglich. Die darin referenzierten Inline-Attachments werden beim Speichern des Zieldatensatzes automatisch mit übernommen und die AttachmentOIDs umgeschlüsselt.
- Die Attachment-Funktionen auf Datensatzebene interagieren nicht mehr mit dem ORM-Cache. Es obliegt dem Aufrufer ggf.
LoadFromCache
/SaveToCache
aufzurufen.
Constants.Attachments… [bei Compilerfehler]
Die Konstanten existieren nicht mehr, da es sich jetzt um Feldnamen von Datensätzen handelt.
DefaultAttachmentsCategory
=>nameof(OrmBABase.DefaultAttachments)
InlineImagesCategory
Hier muss jetzt immer der Name des HTML-Feldes angegeben werden, zu dem das Inline-Image gehört.
GetAttachmentById, GetAttachments, AddAttachment, RemoveAttachment: kein ORM Cache
Die Methoden auf Datensatzebene haben früher standardmäßig die Daten des aktuellen Datensatzes mit den Werten aus dem ORM-Cache überschrieben und die Änderungen danach in selbigen zurückgeschrieben, falls RecordCacheId
gefüllt war und nicht explizit reloadOrmFromCache: false
übergeben wurde. Das ist jetzt nicht mehr der Fall und der Parameter reloadOrmFromCache
existiert nicht mehr.
Wenn Code darauf angewiesen ist, dass eventuelle, ungespeicherte Maskendaten im ORM Cache gelesen oder geschrieben werden sollen, muss das explizit erfolgen (wie bei allen anderen Datensatz-API-Funktionen auch).
Die datensatzunabhängigen Funktionen in Api.Attachments
können wie bisher den ORM-Cache benutzen.
GetAttachments Übergabeparameter [bei Compilerfehler]
Beispiel:
bc… // alt
ormBABase.GetAttachments(new string[] { Name }, AttachmentInlineType.Both)
// neu
ormBABase.GetAttachments(Name)
AttachmentInlineType inline
Eine Filterung nach IsInline
ist mangels dieser Eigenschaft nicht mehr möglich und nicht mehr notwendig. Der entsprechende Übergabeparameter existiert nicht mehr und muss ggf. entfernt werden.
categories -> category
Die Methoden zum Abrufen von Attachments OrmBABase.GetAttachments
und Api.Attachment.GetAttachments
akzeptieren jetzt nur noch eine Kategorie pro Aufruf, da alles andere logisch nicht sinnvoll ist. Die Aufrufe sind entsprechend umzustellen.
Falls doch mehrere Kategorien auf einmal abgerufen werden sollen (aber nicht alle), sollte direkt eine Abfrage auf OrmAttachment
verwendet werden.
GetAttachmentByContentID [bei Compilerfehler]
Die Methode existiert nicht mehr, da das Ergebnis nicht eindeutig ist, wenn dasselbe Inline-Attachment beispielsweise für mehrere Terminteilnehmer repliziert ist. Es sollte statt dessen GetAttachmentById verwendet werden. Die dafür erforderliche OID steht bei HTML-Spalten auch in der Datenbank.
In Api.Html… gibt es Hilfsmethoden, um an die Attachment-OIDs zu kommen bzw. sie umzuschlüsseln.
Api.Attachments.GetAttachmentById [bei Compilerfehler]
Die Methode hat zusätzliche optionale Parameter zum filtern. Falls eine explizite Session übergeben wurde sollte das jetzt per benanntem Parameter geschehen: GetAttachmentById(..., session: mySession);
Api.Attachments.CreateAttachment [bei Compilerfehler]
Die Parameter Kategorie (= Feldname) und Session sind jetzt Pflicht.
category
: Falls die Standard-Kategorie gemeint ist, muss nameof(OrmBABase.DefaultAttachments)
übergeben werden.
Bei Inline-Images muss der Feldname, zu dem das Attachment gehören soll, übergeben werden. Andernfalls funktioniert das Inline-Attachment nicht.
session
: Es muss immer die Session des Objektes angegeben werden, zu dem das Attachment hinzugefügt werden soll. Alles andere gab schon immer eine Exception.
=> Alternativ kann und sollte wo möglich die neue, leistungsfähigere Methode orm.GetOrAddAttachment
verwendet werden, die das Erstellen und Hinzufügen eines Attachments bündelt und auch einige Sonderfälle wie z.B. doppelte ContentIDs oder Attachments von Konfigurationen behandelt.
Api.Attachments.AddAttachmentToOrm [bei Compilerfehler]
Der optionale Parameter Session existiert nicht mehr. Es wird nun automatisch die Session des übergebenen OrmAttachment-Objekts verwendet. Jede andere hat schon immer eine Exception gegeben.
ControlHelperController.AttachmentDownloadByContentId
Eine Funktion zum Abrufen eines Attachments anhand seiner Content-ID ist nicht mehr möglich, da diese nicht eindeutig ist und dadurch unter anderem falsche Leserechte greifen könnten.
Statt dessen sollte DownloadAttachment
verwendet werden, was als Parameter die OID des OrmAttachment
benötigt. Diese steht bei HTML-Spalten jetzt auch als "cid:OID"
-URL in der Datenbank.
Api.Html.ConvertInlineAttachmentsToDownloadUrl
kann die URLs in Inline-Images automatisch anpassen.
GetTotalFileSizeOfAttachmentControl [bei Compilerfehler]
Die Methode existiert nicht mehr, weil die Performance schlecht war. Es sollte Api.Attachments.GetReadableSize(size)
verwendet werden. Die Größe bekommt man (wie bisher) über Api.Attachments.GetTotalFileSize
GetFileSizeInBytes [bei Compilerfehler]
Die Methode heißt jetzt Api.Attachments.GetTotalFileSize
.
Export von HTML mit Inline-Images
Falls Projekt-Code HTML mit Inline-Images exportiert bzw. an Fremdsysteme weiter reicht, sollten die darin enthaltenen URLs der Inline-Images von OID auf Content-ID umgeschrieben werden. Das geht mit der Funktion Api.Html.ConvertHtmlInlineToContentId
. Diese liefert auch gleich die Liste der benötigten Attachments.