{"id":55000149,"date":"2018-10-01T00:00:00","date_gmt":"2020-03-27T19:34:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=149"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Von_Access_zu_Entity_Framework_Daten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Von_Access_zu_Entity_Framework_Daten\/","title":{"rendered":"Von Access zu Entity Framework: Daten"},"content":{"rendered":"<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_149_001.png\" alt=\"Beispiel f&uuml;r ein zu migrierendes Datenmodell\" width=\"649,559\" height=\"299,606\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispiel f&uuml;r ein zu migrierendes Datenmodell<\/span><\/b><\/p>\n<p><b>Viele Leser dieses Magazins programmieren auch mit Access. Daher haben wir im Artikel &#8220;Von Access zu Entity Framework: Datenmodell&#8221; bereits gezeigt, wie Sie die meisten Elemente eines Datenmodells in Klassen f&uuml;r ein Entity Data Model &uuml;berf&uuml;hren, die Sie dann wiederum zum Erstellen einer SQL Server-Datenbank per Code First nutzen k&ouml;nnen. Was fehlt, sind allerdings noch die Daten in diesen Tabellen. Wie Sie den Code erstellen, um auch die Daten &uuml;ber eine entsprechend Seed-Methode in die Datenbank zu schreiben, erfahren Sie in diesem Artikel.<\/b><\/p>\n<p>Im Artikel <b>Von Access zu Entity Framework: Datenmodell <\/b>haben wir uns darum gek&uuml;mmert, das Datenmodell unserer kleinen Access-Beispielanwendung aus Bild 1 zuerst in die Klassen eines Entity Data Models zu &uuml;berf&uuml;hren. Dann haben wir mit den Methoden <b>Add-Migration <\/b>und <b>Update-Database <\/b>in der Paket-Manager-Konsole daf&uuml;r gesorgt, dass diese Klassen zusammen mit den passenden <b>DbSet<\/b>-Auflistungen in eine neue SQL Server-Datenbank &uuml;berf&uuml;hrt wurden. Die dort vorgestellten Routinen sind sicher noch nicht perfekt, aber sie sind eine gute Grundlage, die Sie selbst erweitern k&ouml;nnen &#8211; oder Sie teilen uns einfach mit, bei welchen Eigenarten von Tabellendefinitionen oder Datenmodellen die Erstellung des Entity Data Models oder der SQL Server-Datenbank noch nicht funktioniert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_149_001.png\" alt=\"Beispiel f&uuml;r ein zu migrierendes Datenmodell\" width=\"649,559\" height=\"299,606\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispiel f&uuml;r ein zu migrierendes Datenmodell<\/span><\/b><\/p>\n<p>Im vorliegenden Artikel nun wollen wir die Daten in diesen Tabellen in eine Form bringen, in der wie diese beim Erstellen der Datenbank von Visual Studio aus mit der <b>Seed<\/b>-Methode direkt in die frisch angelegten Tabellen schreiben k&ouml;nnen. Die Grundlagen daf&uuml;r erhalten Sie im Artikel <b>Entity Framework: Tabellen f&uuml;llen<\/b> sowie in den beiden Artikeln <b>Entity Framework: Datenbankinitialisierung <\/b>und <b>Entity Framework: Datenbankmigration<\/b>.<\/p>\n<h2>Anlegen der Daten f&uuml;r eine einzelne Tabelle ohne Fremdschl&uuml;sselfelder<\/h2>\n<p>Wir wollen uns langsam an die L&ouml;sung der Aufgabe heranbewegen und uns zuerst einmal eine einfache Tabelle heraussuchen, deren Daten wir dann &uuml;ber den Weg der <b>Seed<\/b>-Methode etwa der <b>Configuration<\/b>-Klasse im <b>Migrations<\/b>-Ordner nach dem Erstellen des Datenmodells in die Datenbank schreiben (wie Sie diesen Ordner erstellen, erfahren Sie im Artikel <b>Entity Framework: Datenbankmigration<\/b>).<\/p>\n<p>Die Tabelle <b>tblAnreden <\/b>unserer Ausgangsdatenbank enth&auml;lt nur zwei Datens&auml;tze (siehe Bild 2). Diese wollen wir nun in einem ersten Schritt in Anweisungen schreiben, die wir in die <b>Seed<\/b>-Methode der .NET-Anwendung schreiben k&ouml;nnen. Wir schauen uns erst einmal an, wie die fertige <b>Seed<\/b>-Methode anschlie&szlig;end aussehen soll:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_149_001.png\" alt=\"Die Tabelle tblAnreden der Ausgangsdatenbank\" width=\"399,7285\" height=\"148,118\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Tabelle tblAnreden der Ausgangsdatenbank<\/span><\/b><\/p>\n<pre>Namespace Migrations\r\n     Friend NotInheritable Class Configuration \r\n         Inherits DbMigrationsConfiguration(Of BestellverwaltungContext)\r\n         <span style=\"color:blue;\">Public <\/span>Sub New()\r\n             AutomaticMigrationsEnabled = <span style=\"color:blue;\">False<\/span>\r\n         End Sub\r\n         Protected Overrides Sub Seed(context<span style=\"color:blue;\"> As <\/span>BestellverwaltungContext)\r\n             context.Anreden.AddOrUpdate(Function(x) x.ID,\r\n                 <span style=\"color:blue;\">New<\/span> Anrede() <span style=\"color:blue;\">With<\/span> {.Name = \"Herr\"},\r\n                 <span style=\"color:blue;\">New<\/span> Anrede() <span style=\"color:blue;\">With<\/span> {.Name = \"Frau\"}\r\n             )\r\n         End Sub\r\n     End Class\r\nEnd Namespace<\/pre>\n<p>Wir sollten uns &uuml;berlegen, ob wir per VBA immer die komplette Klasse namens <b>Configuration <\/b>wie oben abgebildet erstellen sollen oder nur die <b>Seed<\/b>-Methode in dieser Klasse. Praktischer ist es vermutlich, gleich die komplette Klasse zu erstellen, damit man entweder &#8211; im ersten Schritt &#8211; die Ausgabe dieser Klasse aus dem Direktbereich des VBA-Editors von Access komplett kopieren und als Ganzes in diese Klasse einsetzen kann. Im zweiten Schritt k&ouml;nnten wir den Code direkt in die entsprechende Datei schreiben, die dann von Visual Studio aktualisiert eingelesen wird.<\/p>\n<p>Die <b>Seed<\/b>-Methode enth&auml;lt hier eine Anweisung, bei der wir die <b>AddOrUpdate<\/b>-Methode der Auflistung <b>Anreden <\/b>aufrufen und dieser eine Funktion &uuml;bergeben, welche jeweils ein neues Objekt auf Basis der Klasse <b>Anrede <\/b>enth&auml;lt. F&uuml;r diese legen wir dann jeweils die Anrede fest.<\/p>\n<p>Wir bauen zun&auml;chst eine Prozedur, welche den Rahmen im Direktfenster ausgibt, also die <b>Imports<\/b>-Anweisungen, den Namespace, die Klasse und die enthaltenen Methoden &#8211; mit Ausnahme der <b>Seed<\/b>-Methode:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SeedErstellen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSeed<span style=\"color:blue;\"> As String<\/span>\r\n     strSeed = strSeed & \"Imports System\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSeed = strSeed & \"Imports System.Data.Entity\"\r\n     strSeed = strSeed & \"Imports System.Data.Entity.Migrations\"\r\n     strSeed = strSeed & \"Imports System.Linq\"\r\n     strSeed = strSeed & \"\"\r\n     strSeed = strSeed & \"Namespace Migrations\"\r\n     strSeed = strSeed & \"    Friend NotInheritable Class Configuration\"\r\n     strSeed = strSeed & \"        Inherits DbMigrationsConfiguration(Of BestellverwaltungContext)\"\r\n     strSeed = strSeed & \"        Public Sub New()\"\r\n     strSeed = strSeed & \"            AutomaticMigrationsEnabled = False\"\r\n     strSeed = strSeed & \"        End Sub\"\r\n     strSeed = strSeed & \"        Protected Overrides Sub Seed(context<span style=\"color:blue;\"> As <\/span>BestellverwaltungContext)\"\r\n     strSeed = strSeed & SeedData\r\n     strSeed = strSeed & \"        End Sub\"\r\n     strSeed = strSeed & \"    End Class\"\r\n     strSeed = strSeed & \"End Namespace\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das ist noch kein Hexenwerk. Interessant ist die hier eingebettete Prozedur <b>SeedData<\/b>. Diese stellt die Anweisungen zusammen, die wir zur Methode <b>Seed <\/b>hinzuf&uuml;gen wollen. Statisch sieht das f&uuml;r unsere Tabelle <b>tblAnreden <\/b>zun&auml;chst wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SeedData()\r\n     <span style=\"color:blue;\">Dim <\/span>strSeedData<span style=\"color:blue;\"> As String<\/span>\r\n     strSeedData = strSeedData & \"            context.Anreden.AddOrUpdate(Function(x) x.ID,\"\r\n     strSeedData = strSeedData & \"                <span style=\"color:blue;\">New<\/span> Anrede() <span style=\"color:blue;\">With<\/span> {.Name = \"\"Herr\"\"},\"\r\n     strSeedData = strSeedData & \"                <span style=\"color:blue;\">New<\/span> Anrede() <span style=\"color:blue;\">With<\/span> {.Name = \"\"Frau\"\"}\"\r\n     strSeedData = strSeedData & \"            )\"\r\n     SeedData = strSeedData\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Um dies aus VBA heraus dynamisch f&uuml;r die Tabelle <b>tblAnreden <\/b>zu erzeugen, m&uuml;ssen wir dies allerdings mit einigen erst zur Laufzeit ermittelten Daten f&uuml;llen. Das erledigen wir in den folgenden Schritten.<\/p>\n<h2>Seed f&uuml;r mehrere Tabellen<\/h2>\n<p>Die Prozedur <b>SeedData <\/b>wandeln wir in eine Funktion um, die das Ergebnis an die aufrufende Prozedur zur&uuml;ckgeben soll. Sie enth&auml;lt daf&uuml;r f&uuml;r jede Tabelle der Datenbank einen Aufruf der Tabelle <b>SeedData <\/b>und f&uuml;gt das Ergebnis jeweils an die Zeichenkette <b>strSeed <\/b>an. Die Aufrufe der Tabellen erledigen wir in einer <b>For Each<\/b>-Schleife &uuml;ber alle <b>TableDef<\/b>-Elemente der mit <b>CurrentDb <\/b>referenzierten aktuellen Datenbank. In der Schleife pr&uuml;fen wir zun&auml;chst, ob es sich bei der aktuellen Tabelle nicht um eine Systemtabelle von Access handelt. Nur wenn das nicht der Fall ist, rufen wir die Funktion <b>SeedData <\/b>mit dem Namen der Tabelle auf. Den Namen der Tabelle ermitteln wir dabei mit der Eigenschaft <b>Name <\/b>des <b>TableDef<\/b>-Objekts.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SeedErstellen()\r\n     ...\r\n     strSeed = strSeed & \"        Protected Overrides Sub Seed(context<span style=\"color:blue;\"> As <\/span>BestellverwaltungContext)\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     For Each tdf In db.TableDefs\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Left<\/span>(tdf.Name, 4) = \"MSYS\"<span style=\"color:blue;\"> Then<\/span>\r\n             strSeed = strSeed & SeedData(tdf.Name) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> tdf    strSeed = strSeed & \"        End Sub\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSeed = strSeed & \"    End Class\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSeed = strSeed & \"End Namespace\"\r\n     Inzwischenablage strSeed\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Am Ende der Prozedur nutzen wir die Prozedur <b>InZwischenablage<\/b>, um den Inhalt der Variablen <b>strSeed<\/b>, in der wir die Anweisungen f&uuml;r die <b>Configuration.vb<\/b>-Klasse gesammelt haben, in die Zwischenablage zu kopieren. Das ist eine bessere L&ouml;sung als die Ausgabe im Direktbereich, weil dieser nur eine begrenzte Anzahl Zeichen aufnehmen kann und bei vielen Daten der obere Teil der Ausgabe dann nicht mehr verf&uuml;gbar ist. Die Prozedur <b>InZwischenablage <\/b>finden Sie im Modul <b>mdlZwischenablage<\/b>.<\/p>\n<h2>Die Funktion SeedData zum Zusammenstellen der AddOrUpdate-Aufrufe<\/h2>\n<p>Die Funktion <b>SeedData <\/b>bohren wir gegen&uuml;ber der vorherigen Version erheblich auf. Als Erstes f&auml;llt der Parameter <b>strTabelle <\/b>auf, welcher die Information enth&auml;lt, f&uuml;r die Datens&auml;tze welcher Tabelle die <b>AddOrUpdate<\/b>-Methoden zusammengestellt werden sollen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SeedData(strTabelle<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strSeedData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPK<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFelder<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strEntity<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntities<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strProperty<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Nach der Deklaration der Variablen speichern wir einen Verweis auf die aktuelle Datenbank in der Variablen <b>db<\/b>. Dann pr&uuml;fen wir mit der Funktion <b>GetPrimaryKey<\/b>, die wir bereits im Artikel <b>Von Access zu Entity Framework: Datenmodell <\/b>erl&auml;utert haben, ob die gerade untersuchte Tabelle genau ein Prim&auml;rschl&uuml;sselfeld bereitstellt. Ist das der Fall, wird eine entsprechende Meldung im Direktbereich ausgeben und die Funktion wird mit <b>Exit Function <\/b>verlassen:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> GetPrimaryKey(strTabelle, strPK)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"    ''Mehrere PKs in \" & strTabelle & \". Die Klasse wird nicht erstellt.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span><\/pre>\n<p>Kann jedoch genau ein Prim&auml;rschl&uuml;sselfeld gefunden werden, landet dies in der Variablen <b>strPK<\/b>. Daraus ermitteln wir zun&auml;chst den Namen der Entit&auml;t, indem wir hinten die Zeichenkette <b>ID <\/b>entfernen. Au&szlig;erdem ermittelten wir den Namen der Tabelle, indem wir vom Tabellenname vorn <b>tbl <\/b>abtrennen und das Ergebnis in der Variablen <b>strEntitaeten <\/b>speichern:<\/p>\n<pre>     <span style=\"color:blue;\">Else<\/span>\r\n         strEntity = <span style=\"color:blue;\">Replace<\/span>(strPK, \"ID\", \"\")\r\n         strEntities = <span style=\"color:blue;\">Replace<\/span>(strTabelle, \"tbl\", \"\")<\/pre>\n<p>Damit starten wir in die Ermittlung der ben&ouml;tigten Daten, indem wir ein Recordset auf Basis der mit <b>strTabelle<\/b> &uuml;bergebenen Tabelle erstellen. Au&szlig;erdem tragen wir die erste Zeile in die Variable <b>strSeedData <\/b>ein, welche zum Beispiel bei der Tabelle <b>tblAnreden <\/b>nun <b>context.Anreden.AddOrUpdate(Function(x) x.ID, <\/b>lautet:<\/p>\n<pre>         <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM \" & strTabelle, dbOpenDynaset)\r\n         strSeedData = strSeedData & \"            context.\" & strEntities & \".AddOrUpdate(Function(x) x.ID,\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000149\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000149?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000149\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viele Leser dieses Magazins programmieren auch mit Access. Daher haben wir im Artikel &#8220;Von Access zu Entity Framework: Datenmodell&#8221; bereits gezeigt, wie Sie die meisten Elemente eines Datenmodells in Klassen f&uuml;r ein Entity Data Model &uuml;berf&uuml;hren, die Sie dann wiederum zum Erstellen einer SQL Server-Datenbank per Code First nutzen k&ouml;nnen. Was fehlt, sind allerdings noch die Daten in diesen Tabellen. Wie Sie den Code erstellen, um auch die Daten &uuml;ber eine entsprechend Seed-Methode in die Datenbank zu schreiben, erfahren Sie in diesem Artikel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662018,66052018,44000021,44000022],"tags":[],"yst_prominent_words":[],"class_list":["post-55000149","post","type-post","status-publish","format-standard","hentry","category-662018","category-66052018","category-Entity_Framework","category-Von_Access_zu_NET"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000149"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000149\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000149"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}