{"id":199,"date":"2015-06-21T10:29:29","date_gmt":"2015-06-21T10:29:29","guid":{"rendered":"http:\/\/www.wellcode.de\/home\/?page_id=199"},"modified":"2021-11-05T01:23:22","modified_gmt":"2021-11-05T01:23:22","slug":"wellframe-wellcode-framework-de","status":"publish","type":"page","link":"https:\/\/wellcode.de\/home\/index.php\/de\/wellframe-wellcode-framework-de\/","title":{"rendered":"WellFrame (Wellcode Framework -de)"},"content":{"rendered":"\n<p>Wellframe ist ein Fullstack Software Developing Framework, das anhand von Datenbankdefinitionen (Tabllen, Spalten, Bez\u00fcge, Views) ein vollwertiges Framework gem\u00e4\u00df der MVC Richtlinie generiert. Die Generierung ist Templates gesteuert und kann in mehrere Zielsprachen (wie C#, Java) generiert werden. Hauptfocus ist jedoch C# und .Net.<br>Das Framework basiert auf den modernsten Technologien und erstellt automatisch eine Umgebung, die eine Daten- bzw. Business Schicht enth\u00e4lt, darauf basierend wird automatisch ein (u. A. WCF oder .Net Core) Webservice erstellt, dessen Eigenschaften bereits im Vorfeld mit Hilfe von Meta-Informationen gesteuert werden.<br>F\u00fcr die Pr\u00e4sentationsschicht stellt das Framework elementare Werkzeuge bzw. eine fertige Webentwicklungsumgebung in HTML5, CSS3 und Javascript (SPA) zur Verf\u00fcgung. Die Webentwicklungsumgebung enth\u00e4lt ebenfalls eine Umgebung mit Basisfunktionen zur Erstellung einer Android-App.<br>Die Android-App fungiert als H\u00fclle (\u00e4hnlich wie Phone-Gaps) f\u00fcr die Steuerung der Webanwendung und kann auf Funktionen des Android-Betriebssystems zugreifen.<\/p>\n\n\n\n<p>Hauptfocus im bereitgestellten Framework ist eine Entwicklungsumgebung aufzubauen, die elementare Funktionen zur modernen Softwareentwicklung bereitstellt, ohne von Zusatztools abh\u00e4ngig zu sein. So k\u00f6nnen eigene Anforderungen besser skaliert und alte Projekte besser portiert werden.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Komponenten<\/h1>\n\n\n\n<p>Die wichtigste Funktion des Frameworks ist seine dynamische und transparente Funktionsweise, dies wird erst ersichtlich, wenn alle Komponenten des Framworks zusammen benutzt werden. Damit aber die Funktionsweise umf\u00e4nglich vorgestellt wird, werden hier die Komponenten einzeln mit Beispielen vorgestellt.<\/p>\n\n\n\n<p>Folgendes Flussdiagramm illustriert die Funktionsweise des Wellcode Frameworks:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"\/home\/wp-content\/uploads\/WellFrameFlowChart.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"720\" src=\"\/home\/wp-content\/uploads\/WellFrameFlowChart.png\" alt=\"WellFrameFlowChart\" class=\"wp-image-419\" srcset=\"https:\/\/wellcode.de\/home\/wp-content\/uploads\/WellFrameFlowChart.png 1280w, https:\/\/wellcode.de\/home\/wp-content\/uploads\/WellFrameFlowChart-300x169.png 300w, https:\/\/wellcode.de\/home\/wp-content\/uploads\/WellFrameFlowChart-1024x576.png 1024w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/figure>\n\n\n\n<p>Zuletzt wird dann ein Beispiel vorgestellt, das alle Komponenten zusamen in&nbsp;einer komplette Entwicklungsumgebung einsetzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">WellFrame.dll<\/h2>\n\n\n\n<p>Um mit dem WellFrame zu arbeiten, ben\u00f6tigt man die Bibliothek <strong><em>WellFrame.dll<\/em><\/strong>, darin sind alle n\u00f6tigen Funktionen enthalten, die das Arbeiten mit dem Framework erm\u00f6glichen.<\/p>\n\n\n\n<p>Ein Beispiel kann <a href=\"\/downloads\/AdventureWorkPerson.zip\">hier<\/a> heruntergeladen werden. Dieses Beispiel benutzt das Framework WellFrame, um die <em>Person<\/em> aus der Microsoft Beispieldatenbank <em><strong>AdventureWorks<\/strong><\/em> abzubilden und einige Routinen darauf auszuf\u00fchren.<\/p>\n\n\n\n<p>Die AdventureWorks Datenbank k\u00f6nnen Sie bei Microsoft oder Codeplex <a href=\"http:\/\/msftdbprodsamples.codeplex.com\/\" target=\"_blank\" rel=\"noopener\">hier<\/a> herunterladen oder die Person-Tabelle in einer Datenbank selbst mit folgendem Kommando anlegen<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">CREATE TABLE [Person].[Person](\n\t[BusinessEntityID] [int] NOT NULL,\n\t[PersonType] [nchar](2) NOT NULL,\n\t[NameStyle] [dbo].[NameStyle] NOT NULL CONSTRAINT [DF_Person_NameStyle]  DEFAULT ((0)),\n\t[Title] [nvarchar](8) NULL,\n\t[FirstName] [dbo].[Name] NOT NULL,\n\t[MiddleName] [dbo].[Name] NULL,\n\t[LastName] [dbo].[Name] NOT NULL,\n\t[Suffix] [nvarchar](10) NULL,\n\t[EmailPromotion] [int] NOT NULL CONSTRAINT [DF_Person_EmailPromotion]  DEFAULT ((0)),\n\t[AdditionalContactInfo] [xml](CONTENT [Person].[AdditionalContactInfoSchemaCollection]) NULL,\n\t[Demographics] [xml](CONTENT [Person].[IndividualSurveySchemaCollection]) NULL,\n\t[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Person_rowguid]  DEFAULT (newid()),\n\t[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Person_ModifiedDate]  DEFAULT (getdate()),\n    CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY CLUSTERED \n    (\n\t    [BusinessEntityID] ASC\n    )\n)<\/pre>\n\n\n\n<p>Folgende Schritte sind zu befolgen, um das WellFrame in Ihrer Applikation einzubinden:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li style=\"list-style-type: none;\">\n<ol>\n<li>Laden Sie die Libraries zu WellFrame aus diesem <a href=\"\/downloads\/WellFrame.Standalone.AnyCPU.zip\">Link <\/a>herunter. Die DLLs sind f\u00fcr <em>AnyCPU<\/em> kompiliert.<\/li>\n<li>F\u00fcgen Sie Verweise in Ihrem Projekt auf <em>WellFrame.dll<\/em>, <em>Basics.dll<\/em> und <em>DbmsLibrary.dll<\/em> hinzu.<\/li>\n<li>Die abstrakte Klasse <em>EntityManager<\/em> muss im Projekt abgeleitet werden, \u00fcber diese Klasse k\u00f6nne Entities gruppiert instanziert, ge\u00e4ndert oder gel\u00f6scht werden.<\/li>\n<\/ol>\n<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Wellcode.Frame;\n\nnamespace AdventureWorks\n{\n    public partial class AdvEntityManager\n        : EntityManager\n    {\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ this static instance provides functions for all new generated entities in the class library\n        \/\/\/ &lt;\/summary&gt;\n        public static new AdvEntityManager Manager\n        {\n            get\n            {\n                if (EntityManager._Manager == null)\n                    EntityManager._Manager = new AdvEntityManager();\n                return (AdvEntityManager)EntityManager._Manager;\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Entity <\/strong><\/h2>\n\n\n\n<p>Diese pr\u00e4sentiert sinngem\u00e4\u00df ein Objekt und dessen Eigenschaften. In unserem Beispiel w\u00e4re dies die Klasse <em>Person<\/em>. Die Person enth\u00e4lt Properties, wie FirstName, LastName, etc.<br>Hier ist zu notieren, dass WellFrame die Werte der Entity-Eigenschaften in eine Auflistung speichert. Die Feldnamen der urspr\u00fcnglichen Tabellen werden hierf\u00fcr verwendet. Dies erm\u00f6glich die Nutzung der Entity auch dann, wenn z. B. Datenbankfelder nicht in der Klasse abgebildet sind (Beispiel hierf\u00fcr: benutzerdefinierte Felder).<br>Eine Definition sieht wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">\/\/\/ &lt;summary&gt;\n    \/\/\/ Person \/ Person - Entity \n    \/\/\/ &lt;\/summary&gt;\n    [DataContract]\n    public partial class Person\n        : WebEntity\n    {\n\t\t#region Members\n\n\t\t\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ BusinessEntityId \/ Person.BusinessEntityID\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;int?&lt;\/returns&gt;\n        [DataMember]\n        public virtual int? BusinessEntityId\n        {\n            get\n            {\n                return (int?)this[\"BusinessEntityID\"];\n            }\n            set\n            {\n                this.Add(\"BusinessEntityID\", value, typeof(int?));\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ FirstName \/ Person.FirstName\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;string&lt;\/returns&gt;\n        [DataMember]\n        public virtual string FirstName\n        {\n            get\n            {\n                return (string)this[\"FirstName\"];\n            }\n            set\n            {\n                this.Add(\"FirstName\", value, typeof(string));\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ LastName \/ Person.LastName\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;string&lt;\/returns&gt;\n        [DataMember]\n        public virtual string LastName\n        {\n            get\n            {\n                return (string)this[\"LastName\"];\n            }\n            set\n            {\n                this.Add(\"LastName\", value, typeof(string));\n            }\n        }\n\n        \/\/\/ etc.\n\n\t\t#endregion\n\t} \/\/ Person<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>EntityList<\/strong><\/h2>\n\n\n\n<p>Dies pr\u00e4sentiert eine Auflistung einer <em>Entity<\/em>. Die Basisklasse f\u00fcr die Auflistung hei\u00dft <em>WebEntityList<\/em>&nbsp;In unserem Beispiel w\u00fcrde die Klasse <em>PersonList<\/em> hei\u00dfen und ist wie folgt definiert:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">\/\/\/ &lt;summary&gt;\n    \/\/\/ Person \/ PersonList - List\n    \/\/\/ &lt;\/summary&gt;\n    [DataContract]\n    public partial class PersonList\n        : WebEntityList&lt;Person&gt;\n    {\n    }<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Factory<\/strong><\/h2>\n\n\n\n<p>Zu jeder Entity muss eine Factory-Klasse definiert werden. Die Factory-Klasse enth\u00e4lt die Fachlogik und die Manipulation einer Entity.<br>Die Basisklasse f\u00fcr die Factory hei\u00dft <em>WebEntityFactory<\/em> und nimmt sinnesgem\u00e4\u00df zwei Template-Klassen an, die Entity und deren Auflistung.<br>In unserem Beispiel w\u00e4re die Factory-Klasse f\u00fcr die Person <em>PersonFactory<\/em>. In der Factory k\u00f6nnen diverse Funktion \u00fcberschrieben oder neu hinzugef\u00fcgt werden. Die Definition der Klasse <em>PersonFactory<\/em> kann wie folgt aussehen. Die Definition lehnt sich ma\u00dfgeblich auf die Prim\u00e4rschl\u00fcssel in der Tabelle <em>Person an<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">    \/\/\/ &lt;summary&gt;\n    \/\/\/ Person - Person - Factory \n    \/\/\/ &lt;\/summary&gt;\n    public partial class PersonFactory\n        : WebEntityFactory&lt;Person, PersonList&gt;\n    {\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ Factory Intialisierung. \n\t\t\/\/\/ Tabellenname = Person, \n\t\t\/\/\/ Felder       = \"BusinessEntityID\"\n\t\t\/\/\/ Query        = ...\n        \/\/\/ &lt;\/summary&gt;\n        private PersonFactory(EntityManager manager)\n        {\n\t\t\tthis.Manager = manager;\n\t\t\tthis.TableSchema = \"Person\";\n            this.TableName = \"Person\";\n            this.Fields = new string[]\n            {\n                \"BusinessEntityID\"\n            };\n\t\t\tthis.Query = null;\n            this.Database = DatabaseEnum.Standard;\n        }\n\n\n\t\tinternal static PersonFactory CreateFactory(EntityManager manager)\n\t\t{\n\t\t    return new PersonFactory(manager);\n\t\t}\n\n\t\t\/\/\/ &lt;summary&gt;\n        \/\/\/ Erstellt eine neue instanz zu Person\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Neue instanz zu Person, falls erfolgreich&lt;\/returns&gt;\n        public override Person CreateEntity()\n\t\t{\n\t\t\tvar item = new Person();\n\t\t\t\n\t\t\t\/\/ \u00c4nderungen an den EntityManager melden\n            item.PropertyChanging += this.Manager.WebEntity_PropertyChanging;\n            item.PropertyChanged += this.Manager.WebEntity_PropertyChanged;\n\t\t\titem.AquireEntityManager += this.Manager.AquireEntityManager;\n\n\t\t\treturn item;\n\t\t}\n\n\n\t\t\/\/\/ &lt;summary&gt;\n        \/\/\/ statische Methode f\u00fcr GetEntity \n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Entity, falls vorhanden&lt;\/returns&gt;\n        public Person GetItem(int? businessEntityId)\n        {\n            return this.GetEntity(0, businessEntityId);\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ statische Methode f\u00fcr GetEntity mit Angabe einer Db-Connection\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Entity, falls vorhanden&lt;\/returns&gt;\n        public Person GetItem(DbConnector conn, int? businessEntityId)\n        {\n            return this.GetEntity(conn, 0, businessEntityId);\n        }\n\n\n\t}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>EntityManager<\/strong><\/h2>\n\n\n\n<p>in einer automatisierten Umgebung w\u00fcrde der EntityManager automatisch um diverse Funktion zur Manipulation einer Entity erg\u00e4nzt. In unserem Beispiel m\u00fcssen wir jedoch diese zun\u00e4chst manuell hinzuf\u00fcgen:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">#region Eintr\u00e4ge f\u00fcr EntityManager\n\t\/*\n\t\/\/\/ &lt;summary&gt;\n    \/\/\/ AdvEntityManager Teil zu PersonFactory \/ Person \/ Person.\n    \/\/\/ &lt;\/summary&gt;\n\t*\/\n\tpublic partial class AdvEntityManager\n\t{\n\t\t\/\/\/ &lt;summary&gt;\n        \/\/\/ PersonFactory zu Person \/ Person.\n        \/\/\/ &lt;\/summary&gt;\n        public PersonFactory PersonFactory\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (_PersonFactory == null)\n\t\t\t\t{\n\t\t\t\t\t_PersonFactory = global::AdventureWorks.PersonFactory.CreateFactory(this);\n\n\t\t\t\t\t\/\/ register factory to the entity manager\n\t\t\t\t\tthis.Factories.Add(_PersonFactory, typeof(Person));\n\t\t\t\t}\n\t\t\t\treturn _PersonFactory;\n\t\t\t}\n\t\t}\n\t\tprivate PersonFactory _PersonFactory = null;\n\t\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ GetPerson zu Person \/ Person\n\t\t\/\/\/ Holen einer Entity \u00fcber ihre Primary-Key-Felder\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Entity, falls vorhanden&lt;\/returns&gt;\n        public Person GetPerson(int? businessEntityId)\n        {\n            return this.PersonFactory.GetEntity(0, businessEntityId);\n        }\n\t\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ GetPerson zu Person \/ Person\n\t\t\/\/\/ Holen einer Entity \u00fcber ihre Primary-Key-Felder mit Angabe einer Db\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Entity, falls vorhanden&lt;\/returns&gt;\n        public Person GetPerson(DbConnector conn, int? businessEntityId)\n        {\n            return this.PersonFactory.GetEntity(conn, businessEntityId);\n        }\n\t\n\t\t\/\/\/ &lt;summary&gt;\n        \/\/\/ GetPersonList zu Person \/ Person\n\t\t\/\/\/ Eine Liste von Person mit einer Where-Klausel zur\u00fcckgeben\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Liste m\u00f6glicher Entities&lt;\/returns&gt;\n        public PersonList GetPersonList(SqlWhereClause where)\n        {\n            return this.PersonFactory.GetEntities(where);\n        }\n\n\t\t\/\/\/ &lt;summary&gt;\n        \/\/\/ GetPersonList zu Person \/ Person\n\t\t\/\/\/ Gesamten Inhalt von Person zur\u00fcckgeben\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Liste m\u00f6glicher Entities&lt;\/returns&gt;\n        public PersonList GetPersonList()\n        {\n\t\t\tvar where = new SqlWhereClause();\n            return this.PersonFactory.GetEntities(where);\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ SavePerson zu Person \/ Person\n\t\t\/\/\/ Speichern\/Hinzuf\u00fcgen einer Entity\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Entity, falls vorhanden&lt;\/returns&gt;\n        public Person SavePerson(Person item)\n        {\n            return this.PersonFactory.SaveEntity(item);\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ SavePerson zu Person \/ Person\n\t\t\/\/\/ Speichern\/Hinzuf\u00fcgen einer Entity mit Angabe einer Db-Connection\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;Entity, falls vorhanden&lt;\/returns&gt;\n        public Person SavePerson(DbConnector conn, Person item)\n        {\n            return this.PersonFactory.SaveEntity(conn, item);\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ RemovePerson zu Person \/ Person\n\t\t\/\/\/ Delete an entity object\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;true, if removed&lt;\/returns&gt;\n        public bool RemovePerson(Person item)\n        {\n            return this.PersonFactory.RemoveEntity(item);\n        }\n\t\t\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ RemovePerson zu Person \/ Person\n\t\t\/\/\/ Delete an entity object\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;returns&gt;true, if removed&lt;\/returns&gt;\n        public bool RemovePerson(DbConnector conn, Person item)\n        {\n            return this.PersonFactory.RemoveEntity(conn, item);\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ Speichert eine Auflistung von PersonList. \n        \/\/\/ Als gel\u00f6scht markierte Entities werden endg\u00fcltig gel\u00f6scht\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;param name=\"items\"&gt;&lt;\/param&gt;\n        \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\n        public int SavePersonList(PersonList items)\n        {\n\t\t\treturn this.PersonFactory.SaveEntities(items);\n\t\t}\n\t}\n\n\t#endregion<\/pre>\n\n\n\n<p>Zusammengefasst werden f\u00fcr die Klassen <em>Entity<\/em>, <em>EntityList<\/em>, <em>EntityFactory<\/em>, <em>EntityManager<\/em> zwei Dateien erstellt. Die Klassen selbst m\u00fcssen dann <strong>partiell<\/strong> definiert werden.<br>Das&nbsp;hat den Hintergrund, dass bei voller Aussch\u00f6pfung des Frameworks die Dateien &#8220;<em>*.Designer.cs<\/em>&#8221; automatisch erstellt werden.&nbsp;Daf\u00fcr ist ein ausf\u00fcrhliches Beispiel unter <a href=\"http:\/\/www.wellcode.de\/home\/index.php\/en\/adventureworks-with-willframe\/\">diesem Link<\/a> gepostet.In unserem Beispiel werden folgende Dateien erzeugt:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Die Datei <em>Person.Designer.cs<\/em> enth\u00e4lt alle Properties der <em>Person<\/em>, wie <em>FirstName<\/em>, <em>LastName<\/em>, etc.<br>Weiterhin enth\u00e4lt die Datei partielle Definition f\u00fcr der EntityManager, wie z. B. das Erstellen einer Instanz.<\/li><li>Die zweite Datei Person.cs ist das sogenannte benutzerdefinierte Teil und kann die Fachlogik und einige \u00dcberschreibungen der Basisklassen enthalten.<\/li><\/ol>\n\n\n\n<p>Nun f\u00fchrt man alles zusammen und m\u00f6chte z. B. alle Personen einlesen. Zun\u00e4chst wird ein ConnectionString zu der AdventureWorks-Datenbank zusammengestellt, wie<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">Data Source=.\\SQL2014;Initial Catalog=AdventureWorks2014;Integrated Security=True<\/pre>\n\n\n\n<p>Dann&nbsp;k\u00f6nnen&nbsp;alle Personen mit folgendem Befehl ausgelesen werden<\/p>\n\n\n\n<pre class=\"wp-block-preformatted lang:default decode:true\">Wellcode.Basics.WelloConfig.Instanz.DbConnection.ConnectionString = \n\"Data Source=.\\SQL2014;Initial Catalog=AdventureWorks2014;Integrated Security=True\";\n\n\/\/ get all persons\nvar persons = AdvEntityManager.Manager.GetPersonList();\n\nforeach(var person in persons)\n{\n    Console.WriteLine(person.FirstName + \" \" + person.LastName);\n}\n\n\/\/ change a person name\npersons[0].FirstName = \"changed using WillFrame\";\n\n\/\/ save the changes\nAdvEntityManager.SavePerson(persons[0]);\n\n\/\/ another way to save changes\nAdvEntityManager.SaveAll();\n<\/pre>\n\n\n\n<p>Das komplette&nbsp;Beispiel&nbsp;kann <a href=\"\/downloads\/AdventureWorksPerson.zip\">hier <\/a>heruntergeladen werden. Es ist mit Visual Studio 2013 und dem .Net Framework 4.5 erstellt.<a href=\"\/home\/wp-content\/uploads\/AdventureWorksPerson.png\"><img loading=\"lazy\" decoding=\"async\" width=\"849\" height=\"530\" class=\"alignnone size-full wp-image-143\" src=\"\/home\/wp-content\/uploads\/AdventureWorksPerson.png\" alt=\"AdventureWorksPerson\"><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wellframe ist ein Fullstack Software Developing Framework, das anhand von Datenbankdefinitionen (Tabllen, Spalten, Bez\u00fcge, Views) ein vollwertiges Framework gem\u00e4\u00df der MVC Richtlinie generiert. Die Generierung ist Templates gesteuert und kann in mehrere Zielsprachen (wie C#, Java) generiert werden. Hauptfocus ist jedoch C# und .Net.Das Framework basiert auf den modernsten Technologien und erstellt automatisch eine Umgebung, &hellip; <a href=\"https:\/\/wellcode.de\/home\/index.php\/de\/wellframe-wellcode-framework-de\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">WellFrame (Wellcode Framework -de)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":110,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-199","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/pages\/199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/comments?post=199"}],"version-history":[{"count":12,"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/pages\/199\/revisions"}],"predecessor-version":[{"id":1683,"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/pages\/199\/revisions\/1683"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/media\/110"}],"wp:attachment":[{"href":"https:\/\/wellcode.de\/home\/index.php\/wp-json\/wp\/v2\/media?parent=199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}