Преглед изворни кода

Extends support DomainContextResolver to works with multiple dbcontexts

Dalibor Votruba пре 3 година
родитељ
комит
9582776ef7
25 измењених фајлова са 581 додато и 212 уклоњено
  1. 95 95
      @Documentation/QLiberace.simp
  2. 4 2
      Common/qdr.fnd.core.data.itfc/Domain/IDomain.cs
  3. 10 3
      Common/qdr.fnd.core.data.itfc/Domain/IDomainContextResolver.cs
  4. 3 1
      Common/qdr.fnd.core.data/Domain/DataDomain.cs
  5. 40 6
      Common/qdr.fnd.core.data/Domain/DomainContextResolver.cs
  6. 1 1
      Common/qdr.fnd.core.data/Domain/UnitOfWork.cs
  7. 2 3
      Common/qdr.fnd.core.data/Domain/UnitOfWorkDataDomain.cs
  8. 2 1
      Common/qdr.fnd.core.test/Repositories/GeneralRepositoryTest.cs
  9. 3 2
      Common/qdr.fnd.core.test/RepositoryDbContextTest.cs
  10. 94 0
      Modules/qdr.app.qlbrc.customer/Dtos/ContactDto.cs
  11. 71 0
      Modules/qdr.app.qlbrc.customer/Dtos/CustomerDto.cs
  12. 3 2
      Modules/qdr.app.qlbrc.customer/Entities/Contact.cs
  13. 4 2
      Modules/qdr.app.qlbrc.customer/Entities/DaoMapper/ContactDm.cs
  14. 10 0
      Modules/qdr.app.qlbrc.customer/Enums/ContactTypeEnum.cs
  15. 107 0
      Modules/qdr.app.qlbrc.customer/Services/CustomerService.cs
  16. 4 0
      Modules/qdr.app.qlbrc.customer/qdr.app.qlbrc.customer.csproj
  17. 17 5
      qdr.app.qlbrc.console/Commands/Base/DbContextCommand.cs
  18. 2 2
      qdr.app.qlbrc.console/Commands/Base/DbMigrationCommand.cs
  19. 19 13
      qdr.app.qlbrc.console/Commands/DbClearCmd.cs
  20. 4 9
      qdr.app.qlbrc.console/Commands/DbInitCmd.cs
  21. 30 24
      qdr.app.qlbrc.console/Commands/DbInstallCmd.cs
  22. 23 14
      qdr.app.qlbrc.console/Commands/DbUninstallCmd.cs
  23. 29 24
      qdr.app.qlbrc.console/Commands/DbUpdateCmd.cs
  24. 3 3
      qdr.app.qlbrc.console/TestCmd.cs
  25. 1 0
      qdr.app.qlbrc.console/qdr.app.qlbrc.console.csproj

+ 95 - 95
@Documentation/QLiberace.simp

@@ -27,7 +27,7 @@
     <entity-ids>
       <counter>
         <item-type type-id="group" type="Group" />
-        <value>1413</value>
+        <value>1422</value>
       </counter>
       <counter>
         <item-type type-id="component" type="Component" />
@@ -209,7 +209,7 @@
       </meta>
       <abstract-items />
       <sub-models />
-      <diagram type="uml-component" id="pc5adf2469318408aa71655238685ea62_667242607" name="Architecture - Modules" order-index="1" uid="" name-style="" auto-routed-paths="false" default-line-style="default" show-frame="false" view-location="0,14">
+      <diagram type="uml-component" id="pc5adf2469318408aa71655238685ea62_667242607" name="Architecture - Modules" order-index="1" expanded="true" uid="" name-style="" auto-routed-paths="false" default-line-style="default" show-frame="false" view-location="0,14">
         <style>
           <background-color index="1" color="#FFFFFFFF" />
           <background-color index="2" color="#FFFFFFFF" />
@@ -236,8 +236,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="7546dafc2b0d406bb9cf489c5eeb4aff" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-eeba5657-14f4-4488-94da-b13b4cf80493" name="" navigability="" association-type="association" visibility="private" property-ref="de0957d8d7ac42eab57e579c2cefbf47" />
-              <end-role id="umlar-3b681960-8ff1-4635-ab52-a01bcbce4e78" name="" navigability="yes" association-type="association" visibility="private" property-ref="49ad3ceea0bb4157b557e21e2eb7c0b9" />
+              <start-role id="umlar-7188f75d-d072-4f88-8565-fcb4b3ca65e6" name="" navigability="" association-type="association" visibility="private" property-ref="de0957d8d7ac42eab57e579c2cefbf47" />
+              <end-role id="umlar-85022c14-d226-45a2-8d87-b7afa9c83b80" name="" navigability="yes" association-type="association" visibility="private" property-ref="49ad3ceea0bb4157b557e21e2eb7c0b9" />
             </relation>
           </item>
           <item id="2626a7fd504946ccaa1eb090b6d27d0d" cid="CPT001" type="component" name="Base" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:39:10" visibility="undefined">
@@ -346,19 +346,6 @@
             </stereotype-instances>
             <component />
           </item>
-          <item id="7268ad1b0bd249218475144e6941ccdf" cid="REL001" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:42:51" from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" visibility="package">
-            <stereotypes>
-              <stereotype name="use" />
-            </stereotypes>
-            <stereotype-instances>
-              <stereotype id="7268ad1b0bd249218475144e6941ccdf_use_c" type="use" ref="" />
-            </stereotype-instances>
-            <owned-items />
-            <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" derived="false">
-              <start-role id="umlar-4f24e85d-32e2-4b79-8be3-02f64fabc198" name="" navigability="" association-type="association" visibility="private" property-ref="93016f98fae440bb88e27fe09172df66" />
-              <end-role id="umlar-0ccece1b-f18d-4039-81cb-8752a08feaa1" name="" navigability="yes" association-type="association" visibility="private" property-ref="132ce45236e54d6da05ae53d64712729" />
-            </relation>
-          </item>
           <item id="7546dafc2b0d406bb9cf489c5eeb4aff" cid="CPT002" type="component" name="Customer" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:40:04" visibility="undefined">
             <stereotypes>
               <stereotype name="component" />
@@ -418,6 +405,19 @@
             </stereotype-instances>
             <component />
           </item>
+          <item id="7268ad1b0bd249218475144e6941ccdf" cid="REL001" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:42:51" from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" visibility="package">
+            <stereotypes>
+              <stereotype name="use" />
+            </stereotypes>
+            <stereotype-instances>
+              <stereotype id="7268ad1b0bd249218475144e6941ccdf_use_c" type="use" ref="" />
+            </stereotype-instances>
+            <owned-items />
+            <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" derived="false">
+              <start-role id="umlar-3f7d4a46-8c5f-4e21-ab88-56830fac9847" name="" navigability="" association-type="association" visibility="private" property-ref="93016f98fae440bb88e27fe09172df66" />
+              <end-role id="umlar-21c5451b-8ca5-4fff-aeda-0379b68fb4a1" name="" navigability="yes" association-type="association" visibility="private" property-ref="132ce45236e54d6da05ae53d64712729" />
+            </relation>
+          </item>
           <item id="2037f7bd032e4fa3a1d8d99f1cd1ea27" cid="REL002" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:43:08" from="cb92b4b50dc847aebfdbd90ce365a1eb" to="2626a7fd504946ccaa1eb090b6d27d0d" visibility="package">
             <stereotypes>
               <stereotype name="use" />
@@ -427,8 +427,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-b6978caa-f3da-4881-aa20-cd5dc4f4bd43" name="" navigability="" association-type="association" visibility="private" property-ref="002883f71fbc4324bbd1efa19cdbd1a6" />
-              <end-role id="umlar-c0ff49dd-68be-4825-93a3-2aab32107276" name="" navigability="yes" association-type="association" visibility="private" property-ref="b531bae1520645b58761d8077cac7517" />
+              <start-role id="umlar-14027be4-9815-4641-b6c8-176e8d009b90" name="" navigability="" association-type="association" visibility="private" property-ref="002883f71fbc4324bbd1efa19cdbd1a6" />
+              <end-role id="umlar-c2dcafa4-bfc0-41f5-9e21-510efb2ced19" name="" navigability="yes" association-type="association" visibility="private" property-ref="b531bae1520645b58761d8077cac7517" />
             </relation>
           </item>
         </abstract-items>
@@ -551,8 +551,8 @@
           </item>
           <item id="c19c4449f012422dbba1ddec55021b44" cid="REL004" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:57:00" from="d3486fe91b1f476e8a3393099f04e99e" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="d3486fe91b1f476e8a3393099f04e99e" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-1d3f266e-563a-47af-a371-eb30abedd177" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-6ffb40dc-3809-4b43-9f0b-98b886e1ded5" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-52b1e1bc-86d0-4b08-8b9a-45f649ddaff5" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-6c20cd64-5491-4a7f-8490-b034f8ad4127" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="c34f0bc111894b608624e52c0815c07a" cid="REQ007" type="requirement" name="RQ_TECH_SPEC_FE_4" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:02:23">
@@ -659,14 +659,14 @@
           </item>
           <item id="ce75414afc48414db34ec56233570770" cid="REL005" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:58:04" from="05792695378d4e0fa3cdd3681474e8f6" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="05792695378d4e0fa3cdd3681474e8f6" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-89fc05a7-36b9-4f26-ac4c-31c939356e0e" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-bf47fb42-a52c-4ff4-97aa-b9711cdc3a84" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-0c91105d-5d3d-487e-a945-be6a5f3bc14f" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-e1b8f47f-e50d-4b6f-a9f3-c72c18a4f6a8" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="57b3095ce64f4492bf2b9b93738232bf" cid="REL007" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:02:23" from="c34f0bc111894b608624e52c0815c07a" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="c34f0bc111894b608624e52c0815c07a" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-75279aa3-483e-47d5-8ad9-50406f226300" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-17440eff-58d4-4990-89fd-1efc6f32c898" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-a1a1a633-3052-4dae-a758-0caf451558c7" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-e25c0875-9bc8-40bb-8e31-6d2726e9946d" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="05792695378d4e0fa3cdd3681474e8f6" cid="REQ005" type="requirement" name="RQ_TECH_SPEC_FRAMEWORK_2" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:58:04">
@@ -827,26 +827,26 @@
           </item>
           <item id="b92a1d894874430fb846cd4ffebbe4e1" cid="REL014" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:09:33" from="f57cd7c78a5e483ebb3edb6a59957a97" to="c54c944000d84837bbb378cebd81a4e2" visibility="package">
             <relation from="f57cd7c78a5e483ebb3edb6a59957a97" to="c54c944000d84837bbb378cebd81a4e2" derived="false">
-              <start-role id="umlar-44a0b8b9-555e-4921-8d40-36c63b18ce33" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-d38d770b-df37-4672-a742-14b36b996af2" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-36286ad5-ee1f-4231-9d5b-a4c2766182d6" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-3031ca25-f7e8-463d-8b11-677b11c1a15f" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="2ffa044974b44d11a13593ba0173375b" cid="REL010" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:05:39" from="b2345a523c6b4b969a3fc4b92c2a427e" to="f3f58833e12d41adbad092d5fa821ae6" visibility="package">
             <relation from="b2345a523c6b4b969a3fc4b92c2a427e" to="f3f58833e12d41adbad092d5fa821ae6" derived="false">
-              <start-role id="umlar-079bbf53-5925-4e79-8087-dd07d32659ab" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-8cac9f7b-7f55-4bed-8488-fdc14e5248f1" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-b52b8a8f-4338-4a04-af8d-80770d014c18" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-24dc07bb-aba1-43ed-acf3-9da8174a494c" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="b8f1b1ee8380442a9b9806bcaabd60e1" cid="REL009" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:04:56" from="c776555b542842099176f5d00fbd63e4" to="f3f58833e12d41adbad092d5fa821ae6" visibility="package">
             <relation from="c776555b542842099176f5d00fbd63e4" to="f3f58833e12d41adbad092d5fa821ae6" derived="false">
-              <start-role id="umlar-a1dca07d-0d84-4729-b641-4c6c66a5ff13" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-a7aaa1a5-daf5-4bc2-ba2d-c32229a82518" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-5be3707d-78f1-458c-a4c0-c72e3ff7b125" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-d84a7ab0-c032-448c-a94a-fa16bca1deb8" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="d31aa3cec9784517b6f38b38341c1799" cid="REL006" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:59:19" from="cc5e96719a7b4470b17001e1bc806b61" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="cc5e96719a7b4470b17001e1bc806b61" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-07bc3b69-1676-4e7a-b7dd-87bee43c43ae" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-5987b3a4-d433-40ca-a9a7-5eb63181ac1b" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-dd311a07-d16b-4e18-a336-b466dcc887d5" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-13e02269-6f8c-496f-b733-0415c68a8e40" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="d3486fe91b1f476e8a3393099f04e99e" cid="REQ004" type="requirement" name="RQ_TECH_SPEC_PLATFORM_1" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:57:00">
@@ -949,8 +949,8 @@
           </item>
           <item id="6236eeabf4f94d1984205fd7fcb75b72" cid="REL008" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:04:52" from="c42a187a572a4c2c80d005bf4ea52f65" to="f3f58833e12d41adbad092d5fa821ae6" visibility="package">
             <relation from="c42a187a572a4c2c80d005bf4ea52f65" to="f3f58833e12d41adbad092d5fa821ae6" derived="false">
-              <start-role id="umlar-1434f379-04de-48d1-bcb4-98e83a4dc3ab" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-4dd0ec84-2f8a-4344-8b53-a80dc0615df5" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-519b1197-5887-4d83-a33b-e0e5d01d1595" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-4443f2ba-cbb1-4842-866c-c981ee10d9e1" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="b2345a523c6b4b969a3fc4b92c2a427e" cid="REQ009" type="requirement" name="RQ_SUP_SETTINGS" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:05:39">
@@ -1068,14 +1068,14 @@
           </item>
           <item id="613bacfba1584c98951c8961e3c0cc5e" cid="REL011" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:07:27" from="c54c944000d84837bbb378cebd81a4e2" to="0a48454de005413c92e4a5cce0d2982c" visibility="package">
             <relation from="c54c944000d84837bbb378cebd81a4e2" to="0a48454de005413c92e4a5cce0d2982c" derived="false">
-              <start-role id="umlar-4e610d22-3410-4989-9054-79c74fc9134a" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-114574e2-bd70-4184-93d4-3c9a5b3e30d9" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-f4edc967-a8db-4d7a-86e5-8a96e5479aff" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-6542118f-cc93-4e72-a735-89a20dfc428c" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="4db2cc42f34c4caa94683e00c470b9da" cid="REL013" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:08:33" from="7888a9de9bb14ac0a6fadd2418d0d7a6" to="c54c944000d84837bbb378cebd81a4e2" visibility="package">
             <relation from="7888a9de9bb14ac0a6fadd2418d0d7a6" to="c54c944000d84837bbb378cebd81a4e2" derived="false">
-              <start-role id="umlar-ed776e36-7345-4add-b861-2ea7416f6db4" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-9c9a1d05-d4f4-4359-85e5-2b6fa6abc500" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-bf56db83-f216-403c-b661-95e8481972e6" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-54f2f287-9ba5-4697-9419-de6904e5fe95" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="f2c72e50f02843f08f5a7b84d1b0047f" cid="REQ012" type="requirement" name="RQ_CSTR_APP" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:07:51">
@@ -1303,8 +1303,8 @@
           </item>
           <item id="fbc97786a07c4aaa90c643ba77619c6e" cid="REL012" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:07:51" from="f2c72e50f02843f08f5a7b84d1b0047f" to="0a48454de005413c92e4a5cce0d2982c" visibility="package">
             <relation from="f2c72e50f02843f08f5a7b84d1b0047f" to="0a48454de005413c92e4a5cce0d2982c" derived="false">
-              <start-role id="umlar-1384996d-f298-4424-ba64-ac5e5552973e" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-8bb7904d-d510-4725-ad86-fe0a3a2682ad" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-33601cf0-2ec5-4f45-912a-497c6c244aa0" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-78084bbd-ba15-4335-b5ef-9a82f16e4178" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
         </abstract-items>
@@ -1542,6 +1542,19 @@
                   </index>
                 </indexes>
               </item>
+              <item id="eed22cb50bf14a369a44386ecff2eddf" cid="REL_SETTING_SETTING_ID" type="erd-relationship" name="REL_SETTING_SETTING_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:46:59" from="1995ba399cb24729b4df7bbbc0c77b31" to="1995ba399cb24729b4df7bbbc0c77b31">
+                <stereotypes>
+                  <stereotype name="relation" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="eed22cb50bf14a369a44386ecff2eddf_relation_c" type="relation" ref="" />
+                </stereotype-instances>
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a08479372eb77415d9e7fc24b12fd0d42593" to-attribute="a43f81acbacea4b5eb1ab53c404241e92410" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
               <item id="031a668b1d6a45e1907a612d85b43d24" cid="TBL_USER" type="erd-entity" name="User" style-class="Flat Green" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:15:45">
                 <stereotypes>
                   <stereotype name="table" />
@@ -1567,29 +1580,29 @@
                   </index>
                 </indexes>
               </item>
-              <item id="eed22cb50bf14a369a44386ecff2eddf" cid="REL_SETTING_SETTING_ID" type="erd-relationship" name="REL_SETTING_SETTING_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:46:59" from="1995ba399cb24729b4df7bbbc0c77b31" to="1995ba399cb24729b4df7bbbc0c77b31">
+              <item id="38364cd5ebf7433c827087a1d94c73ca" cid="REL_TENANTUSER_USER_ID" type="erd-relationship" name="REL_TENANTUSER_USER_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:28:44" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="031a668b1d6a45e1907a612d85b43d24">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="eed22cb50bf14a369a44386ecff2eddf_relation_c" type="relation" ref="" />
+                  <stereotype id="38364cd5ebf7433c827087a1d94c73ca_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a08479372eb77415d9e7fc24b12fd0d42593" to-attribute="a43f81acbacea4b5eb1ab53c404241e92410" />
+                    <attribute-pair from-attribute="a6e7eae435a0345fea29288220aa8aa1d623" to-attribute="a6dda4862ea794595834ccbbeacdb68a8699" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="38364cd5ebf7433c827087a1d94c73ca" cid="REL_TENANTUSER_USER_ID" type="erd-relationship" name="REL_TENANTUSER_USER_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:28:44" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="031a668b1d6a45e1907a612d85b43d24">
+              <item id="ccc94b03e9f14adf85defc647f594921" cid="REL023" type="erd-relationship" name="REL_COUNTRY_CURRENCY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:28:10" from="84a3ecb6b97b4e9cbcf5d8255039f80c" to="cb80b20360f340559de7775b16dcf14f">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="38364cd5ebf7433c827087a1d94c73ca_relation_c" type="relation" ref="" />
+                  <stereotype id="ccc94b03e9f14adf85defc647f594921_relation_c" type="relation" ref="" />
                 </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a6e7eae435a0345fea29288220aa8aa1d623" to-attribute="a6dda4862ea794595834ccbbeacdb68a8699" />
+                    <attribute-pair from-attribute="ab59af341336049cab67540f6403cce1425" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
@@ -1606,31 +1619,32 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="ccc94b03e9f14adf85defc647f594921" cid="REL023" type="erd-relationship" name="REL_COUNTRY_CURRENCY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:28:10" from="84a3ecb6b97b4e9cbcf5d8255039f80c" to="cb80b20360f340559de7775b16dcf14f">
+              <item id="06c92dd941704baf86d79ecead01e134" cid="REL_TENANTUSER_TENANT_ID" type="erd-relationship" name="REL_TENANTUSER_TENANT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:26:57" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="e50f79968a404d3fbb33f4a02fa3b572">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="ccc94b03e9f14adf85defc647f594921_relation_c" type="relation" ref="" />
+                  <stereotype id="06c92dd941704baf86d79ecead01e134_relation_c" type="relation" ref="" />
                 </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="ab59af341336049cab67540f6403cce1425" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
+                    <attribute-pair from-attribute="ab59b0b6bdd31441c89af642f0131a84b208" to-attribute="aeda82a68426646d3a6cfa276db9bd56f255" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="06c92dd941704baf86d79ecead01e134" cid="REL_TENANTUSER_TENANT_ID" type="erd-relationship" name="REL_TENANTUSER_TENANT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:26:57" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="e50f79968a404d3fbb33f4a02fa3b572">
+              <item id="979e2dd2651742e08af31f818c22bf4e" cid="ENT007" type="erd-entity" name="TenantCountry" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:13:26">
                 <stereotypes>
-                  <stereotype name="relation" />
+                  <stereotype name="table" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="06c92dd941704baf86d79ecead01e134_relation_c" type="relation" ref="" />
+                  <stereotype id="979e2dd2651742e08af31f818c22bf4e_table_c" type="table" ref="" />
                 </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="ab59b0b6bdd31441c89af642f0131a84b208" to-attribute="aeda82a68426646d3a6cfa276db9bd56f255" />
-                  </attribute-pairs>
-                </erd-relation>
+                <entity description="" />
+                <attributes>
+                  <attribute uid="af9002db56cf14129b96aa8a533353459288" cid="EA037" name="TenantId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to tenant" default-value="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
+                  <attribute uid="ac565ef6d613e4ce395193ba85470dd24288" cid="EA038" name="CountryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to country" default-value="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
+                </attributes>
+                <indexes />
               </item>
               <item id="84a3ecb6b97b4e9cbcf5d8255039f80c" cid="ENT005" type="erd-entity" name="Country" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:12:36">
                 <stereotypes>
@@ -1658,20 +1672,6 @@
                   </index>
                 </indexes>
               </item>
-              <item id="979e2dd2651742e08af31f818c22bf4e" cid="ENT007" type="erd-entity" name="TenantCountry" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:13:26">
-                <stereotypes>
-                  <stereotype name="table" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="979e2dd2651742e08af31f818c22bf4e_table_c" type="table" ref="" />
-                </stereotype-instances>
-                <entity description="" />
-                <attributes>
-                  <attribute uid="af9002db56cf14129b96aa8a533353459288" cid="EA037" name="TenantId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to tenant" default-value="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
-                  <attribute uid="ac565ef6d613e4ce395193ba85470dd24288" cid="EA038" name="CountryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to country" default-value="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
-                </attributes>
-                <indexes />
-              </item>
               <item id="a48a9211b03c407cbb288eded410b64a" cid="REL019" type="erd-relationship" name="REL_TENANTCOUNTRY_TENANT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:24:18" from="979e2dd2651742e08af31f818c22bf4e" to="e50f79968a404d3fbb33f4a02fa3b572">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -1726,6 +1726,19 @@
                   </index>
                 </indexes>
               </item>
+              <item id="4c112af66ef746a3897a3e2a89b04793" cid="REL022" type="erd-relationship" name="REL_TENANTCURRENCY_CURRENCY__ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:26:21" from="1596d482602d4447b90d648ed5031bb4" to="cb80b20360f340559de7775b16dcf14f">
+                <stereotypes>
+                  <stereotype name="relation" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="4c112af66ef746a3897a3e2a89b04793_relation_c" type="relation" ref="" />
+                </stereotype-instances>
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a743bc958b32142279f0be7a53e28a40f887" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
               <item id="cb80b20360f340559de7775b16dcf14f" cid="ENT006" type="erd-entity" name="Currency" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:12:59">
                 <stereotypes>
                   <stereotype name="table" />
@@ -1751,19 +1764,6 @@
                   </index>
                 </indexes>
               </item>
-              <item id="4c112af66ef746a3897a3e2a89b04793" cid="REL022" type="erd-relationship" name="REL_TENANTCURRENCY_CURRENCY__ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:26:21" from="1596d482602d4447b90d648ed5031bb4" to="cb80b20360f340559de7775b16dcf14f">
-                <stereotypes>
-                  <stereotype name="relation" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="4c112af66ef746a3897a3e2a89b04793_relation_c" type="relation" ref="" />
-                </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="a743bc958b32142279f0be7a53e28a40f887" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
               <item id="f7ba98ff46b54ebd99e6e9d48d4aeee9" cid="TBL_TENANTUSER" type="erd-entity" name="TenantUser" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:22:55">
                 <stereotypes>
                   <stereotype name="table" />
@@ -1975,7 +1975,7 @@
           </meta>
           <abstract-items />
           <sub-models />
-          <diagram type="entity-relationship" id="p5a74a7511e1f4e77b1be5b12283df6eb_762285763" name="Customer" order-index="1" uid="" auto-routed-paths="false" default-line-style="default" view-location="0,80">
+          <diagram type="entity-relationship" id="p5a74a7511e1f4e77b1be5b12283df6eb_762285763" name="Customer" order-index="1" uid="" name-style="" auto-routed-paths="false" default-line-style="default" view-location="0,80">
             <style>
               <background-color index="1" color="#FFFFFFFF" />
               <background-color index="2" color="#FFFFFFFF" />
@@ -2011,7 +2011,7 @@
                   <attribute uid="a7df60cf2857946e9957c0adc8104966f524" cid="EA068" name="City" type="nvarchar" type-id="MsSql.nvarchar" type-size="50" foreign-key="false" primary-key="false" nullable="true" description="Contact city." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
                   <attribute uid="ad2e1266766e04710bff1b321e8b0eb88524" cid="EA069" name="ZIP" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="true" description="Contact ZIP code." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
                   <attribute uid="a25b21cc445814c56a26958245c40002c524" cid="EA070" name="CountryCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="5" foreign-key="false" primary-key="false" nullable="true" description="Contact country code." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
-                  <attribute uid="a0656c09ec92a442197683462c76ae580525" cid="EA071" name="IsPreffered" type="bit" type-id="MsSql.bit" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Flag if Contact is preffered." default-value="0" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a0656c09ec92a442197683462c76ae580525" cid="EA071" name="IsPreferred" type="bit" type-id="MsSql.bit" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Flag if Contact is preferred." default-value="0" auto-increment="false" creation-date="11/06/2022 04:58:50" />
                   <attribute uid="a2a2d4b79ba1641c4a768434190f5367b525" cid="EA072" name="Created" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record created timestamp" default-value="getdate()" auto-increment="false" creation-date="11/06/2022 04:58:50" />
                   <attribute uid="ab06e1cd4c24d47d9993c7db7f5e9245a525" cid="EA073" name="Modified" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record modified timestamp" default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
                   <attribute uid="a124b70a289be40c492ca810315cec7c4525" cid="EA074" name="Modifier" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="true" description="Record modifier signature" default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
@@ -2123,7 +2123,7 @@
           </meta>
           <abstract-items />
           <sub-models />
-          <diagram type="entity-relationship" id="pcd77863d94614dca9af3ca3aef2e3f8f_679580685" name="Notification" order-index="1" expanded="true" uid="" auto-routed-paths="false" default-line-style="default" view-location="-76,2" zoom="0.588806">
+          <diagram type="entity-relationship" id="pcd77863d94614dca9af3ca3aef2e3f8f_679580685" name="Notification" order-index="1" expanded="true" uid="" name-style="" auto-routed-paths="false" default-line-style="default" view-location="-76,2" zoom="0.588806">
             <style>
               <background-color index="1" color="#FFFFFFFF" />
               <background-color index="2" color="#FFFFFFFF" />
@@ -2800,7 +2800,7 @@
           </meta>
           <abstract-items />
           <sub-models>
-            <model id="pe0e8f121bf7c4fd7b8ec69a3248b8637_619350725" name="Base" namespace="" order-index="1">
+            <model id="pe0e8f121bf7c4fd7b8ec69a3248b8637_619350725" name="Base" namespace="" order-index="1" expanded="true">
               <meta>
                 <authors>
                   <author> </author>
@@ -2813,7 +2813,7 @@
               </meta>
               <abstract-items />
               <sub-models>
-                <model id="p86104765aa514bc1a0a9d45c4b94488e_464839088" name="Services" namespace="" order-index="2">
+                <model id="p86104765aa514bc1a0a9d45c4b94488e_464839088" name="Services" namespace="" order-index="2" expanded="true">
                   <meta>
                     <authors>
                       <author> </author>
@@ -3122,7 +3122,7 @@
                 </model>
               </sub-models>
             </model>
-            <model id="p223e98f24dc24b5ba97eaf31797eaf4f_349702731" name="Common" namespace="" order-index="2">
+            <model id="p223e98f24dc24b5ba97eaf31797eaf4f_349702731" name="Common" namespace="" order-index="2" expanded="true">
               <meta>
                 <authors>
                   <author> </author>
@@ -3135,7 +3135,7 @@
               </meta>
               <abstract-items />
               <sub-models>
-                <model id="p7e57d3bc587141998753a4e43ade41c2_822514128" name="Services" namespace="" order-index="1">
+                <model id="p7e57d3bc587141998753a4e43ade41c2_822514128" name="Services" namespace="" order-index="1" expanded="true">
                   <meta>
                     <authors>
                       <author> </author>
@@ -3210,7 +3210,7 @@
                 </model>
               </sub-models>
             </model>
-            <model id="p86283f6d46a746afabaffdd167058442_433835851" name="Customer" namespace="" order-index="3">
+            <model id="p86283f6d46a746afabaffdd167058442_433835851" name="Customer" namespace="" order-index="3" expanded="true">
               <meta>
                 <authors>
                   <author> </author>

+ 4 - 2
Common/qdr.fnd.core.data.itfc/Domain/IDomain.cs

@@ -1,6 +1,8 @@
-namespace Quadarax.Foundation.Core.Data.Interface.Domain
+using System;
+
+namespace Quadarax.Foundation.Core.Data.Interface.Domain
 {
-    public interface IDomain
+    public interface IDomain : IDisposable
     {
         public IUnitOfWork<TDomainContext> CreateUnitOfWork<TDomainContext>() where TDomainContext : IDomain;
         public void Commit();

+ 10 - 3
Common/qdr.fnd.core.data.itfc/Domain/IDomainContextResolver.cs

@@ -1,7 +1,14 @@
-namespace Quadarax.Foundation.Core.Data.Interface.Domain
+using System;
+
+namespace Quadarax.Foundation.Core.Data.Interface.Domain
 {
-    public interface IDomainContextResolver<TDomainContext> where TDomainContext : IDomain
+    public interface IDomainContextResolver : IDisposable
     {
-        TReturnContext GetCurrent<TReturnContext>() where TReturnContext : TDomainContext;
+        string[] RegisteredContexts { get; }
+
+        TDomainContext GetCurrent<TDomainContext>() where TDomainContext : IDomain;
+
+        IDomain Get(string typeFullName);
+        TDomainContext Register<TDomainContext>(TDomainContext context) where TDomainContext : IDomain;
     }
 }

+ 3 - 1
Common/qdr.fnd.core.data/Domain/DataDomain.cs

@@ -28,7 +28,9 @@ namespace Quadarax.Foundation.Core.Data.Domain
 
         public IUnitOfWork<TDomainContext> CreateUnitOfWork<TDomainContext>() where TDomainContext : IDomain
         {
-            return new UnitOfWork<TDomainContext>((IDomainContextResolver<TDomainContext>)new DomainContextResolver<DataDomain>(this));
+            var dcr = new DomainContextResolver();
+            dcr.Register(this);
+            return new UnitOfWork<TDomainContext>(dcr);
         }
 
 

+ 40 - 6
Common/qdr.fnd.core.data/Domain/DomainContextResolver.cs

@@ -1,21 +1,55 @@
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Object;
 
 namespace Quadarax.Foundation.Core.Data.Domain
 {
-    public class DomainContextResolver<TDomainContext> : IDomainContextResolver<TDomainContext> where TDomainContext: DataDomain
+    public class DomainContextResolver : DisposableObject, IDomainContextResolver
     {
-        private TDomainContext _context;
+        private readonly IDictionary<string, IDomain> _contextCache;
 
-        public DomainContextResolver(TDomainContext context)
+        public string[] RegisteredContexts => _contextCache.Keys.ToArray();
+
+        public DomainContextResolver()
+        {
+            _contextCache = new Dictionary<string, IDomain>();
+        }
+
+        public IDomain Get(string typeFullName)
         {
-            _context = context ?? throw new ArgumentNullException(nameof(context));
+            if (!_contextCache.ContainsKey(typeFullName))
+                throw new InvalidOperationException($"Domain context '{typeFullName}' not found in DomainContextResolver. Not registered.");
+            return _contextCache[typeFullName];
         }
 
+        public TDomainContext Register<TDomainContext>(TDomainContext context) where TDomainContext : IDomain
+        {
+            if (_contextCache.ContainsKey(typeof(TDomainContext).FullName!))
+                throw new InvalidOperationException($"Domain context '{typeof(TDomainContext).FullName}' is already registered.");
+            _contextCache.Add(typeof(TDomainContext).FullName!, context);
+            return GetCurrent<TDomainContext>();
+        }
+
+
+        public TDomainContext GetCurrent<TDomainContext>() where TDomainContext : IDomain
+        {
+            if (!_contextCache.ContainsKey(typeof(TDomainContext).FullName!))
+                throw new InvalidOperationException($"Domain context '{typeof(TDomainContext).FullName}' not found in DomainContextResolver. Not registered.");
+
+            return (TDomainContext)_contextCache[typeof(TDomainContext).FullName!];
+        }
 
-        public TReturnContext GetCurrent<TReturnContext>() where TReturnContext : TDomainContext
+        protected override void OnDisposing()
         {
-            return (TReturnContext) _context;
+            if (_contextCache != null)
+            {
+                foreach (var context in _contextCache.Values)
+                {
+                    context.Dispose();
+                }
+            }
         }
     }
 }

+ 1 - 1
Common/qdr.fnd.core.data/Domain/UnitOfWork.cs

@@ -12,7 +12,7 @@ namespace Quadarax.Foundation.Core.Data.Domain
         public Guid Stamp { get; protected set; }
         public int CtxHash => Context.GetHashCode();
 
-        public UnitOfWork(IDomainContextResolver<TDomainContext> context,Guid? customStamp = null)
+        public UnitOfWork(IDomainContextResolver context,Guid? customStamp = null)
         {
             Context = context.GetCurrent<TDomainContext>();
             if (customStamp == null) 

+ 2 - 3
Common/qdr.fnd.core.data/Domain/UnitOfWorkDataDomain.cs

@@ -1,5 +1,4 @@
-using Quadarax.Foundation.Core.Attributes;
-using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 
 namespace Quadarax.Foundation.Core.Data.Domain
 {
@@ -8,7 +7,7 @@ namespace Quadarax.Foundation.Core.Data.Domain
     //[DiImplementsOf(typeof(IUnitOfWork<DataDomain>), LifeCycleTypeEnum.Scoped)]
     public class UnitOfWorkDataDomain : UnitOfWork<DataDomain>, IUnitOfWork<IDomain>
     {
-        public UnitOfWorkDataDomain(IDomainContextResolver<DataDomain> context) : base(context)
+        public UnitOfWorkDataDomain(IDomainContextResolver context) : base(context)
         {
         }
 

+ 2 - 1
Common/qdr.fnd.core.test/Repositories/GeneralRepositoryTest.cs

@@ -103,7 +103,8 @@ namespace qdr.fnd.core.test.Repositories
         {
             var context = new TestDbContext(new DbContextOptions<TestDbContext>());
             context.Database.EnsureCreated();
-            var dbcResolver = new DomainContextResolver<TestDbContext>(context);
+            var dbcResolver = new DomainContextResolver();
+            dbcResolver.Register(context);
 
             using (var uow = new UnitOfWork<TestDbContext>(_dbcResolver))
             {

+ 3 - 2
Common/qdr.fnd.core.test/RepositoryDbContextTest.cs

@@ -7,14 +7,15 @@ namespace qdr.fnd.core.test
         where TRepository : IRepository
     {
         // ReSharper disable once InconsistentNaming
-        protected DomainContextResolver<TDbContext>? _dbcResolver;
+        protected DomainContextResolver? _dbcResolver;
         protected UnitOfWork<TDbContext> Uow { get; private set; } = null!;
 
         protected override void OnSetup()
         {
             var context = new TDbContext();
             context.Database.EnsureCreated();
-            _dbcResolver = new DomainContextResolver<TDbContext>(context);
+            _dbcResolver = new DomainContextResolver();
+            _dbcResolver.Register(context);
             Uow = new UnitOfWork<TDbContext>(_dbcResolver);
         }
 

+ 94 - 0
Modules/qdr.app.qlbrc.customer/Dtos/ContactDto.cs

@@ -0,0 +1,94 @@
+using System.Runtime.CompilerServices;
+using Quadarax.Application.QLiberace.Common.Dtos;
+using Quadarax.Application.QLiberace.Customer.Enums;
+using Quadarax.Foundation.Core.Data.Interface.Entity;
+
+#if DEBUG
+[assembly: InternalsVisibleTo("qdr.app.qlbrc.base.Tests")]
+[assembly: InternalsVisibleTo("qdr.app.qlbrc.common.Tests")]
+#endif
+
+namespace Quadarax.Application.QLiberace.Customer.Dtos
+{
+    public class ContactRDto : QlbrcDtoTrackedWithId, IReadDto
+    {
+        /// <summary>
+        /// Reference to customer that contact belongs
+        /// </summary>
+        public long CustomerId { get; set; }
+        /// <summary>
+        /// Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)
+        /// </summary>
+        public ContactTypeEnum Type { get; set; }
+        /// <summary>
+        /// Contact heading caption.
+        /// </summary>
+        public string Caption { get; set; } = null!;
+        /// <summary>
+        /// Main address value. If phone, email, sms stores email address or telephone number.
+        /// </summary>
+        public string Address { get; set; } = null!;
+        /// <summary>
+        /// Secondary address value.
+        /// </summary>
+        public string? Address1 { get; set; }
+        /// <summary>
+        /// Contact city.
+        /// </summary>
+        public string? City { get; set; }
+        /// <summary>
+        /// Contact ZIP code.
+        /// </summary>
+        public string? Zip { get; set; }
+        /// <summary>
+        /// Contact country code.
+        /// </summary>
+        public string? CountryCode { get; set; }
+        /// <summary>
+        /// Flag if Contact is preffered.
+        /// </summary>
+        public bool IsPreffered { get; set; }
+
+    }
+
+    public class ContactWDto : QlbrcDtoWithoutId, IUpdateDto, ICreateDto
+    {
+        /// <summary>
+        /// Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)
+        /// </summary>
+        public ContactTypeEnum Type { get; set; }
+        /// <summary>
+        /// Contact heading caption.
+        /// </summary>
+        public string Caption { get; set; } = null!;
+        /// <summary>
+        /// Main address value. If phone, email, sms stores email address or telephone number.
+        /// </summary>
+        public string Address { get; set; } = null!;
+        /// <summary>
+        /// Secondary address value.
+        /// </summary>
+        public string? Address1 { get; set; }
+        /// <summary>
+        /// Contact city.
+        /// </summary>
+        public string? City { get; set; }
+        /// <summary>
+        /// Contact ZIP code.
+        /// </summary>
+        public string? Zip { get; set; }
+        /// <summary>
+        /// Contact country code.
+        /// </summary>
+        public string? CountryCode { get; set; }
+        /// <summary>
+        /// Flag if Contact is preffered.
+        /// </summary>
+        public bool IsPreferred { get; set; }
+
+    }
+
+    public class ContactDDto : QlbrcDtoWithId, IDeleteDto
+    {
+    }
+}

+ 71 - 0
Modules/qdr.app.qlbrc.customer/Dtos/CustomerDto.cs

@@ -0,0 +1,71 @@
+using System.Runtime.CompilerServices;
+using Quadarax.Application.QLiberace.Common.Dtos;
+using Quadarax.Foundation.Core.Data.Interface.Entity;
+
+#if DEBUG
+[assembly: InternalsVisibleTo("qdr.app.qlbrc.base.Tests")]
+[assembly: InternalsVisibleTo("qdr.app.qlbrc.common.Tests")]
+#endif
+
+namespace Quadarax.Application.QLiberace.Customer.Dtos
+{
+    public class CustomerRDto : QlbrcDtoTrackedWithId, IReadDto
+    {
+        /// <summary>
+        /// Customer code. Main key to search.
+        /// </summary>
+        public string Code { get; set; } = null!;
+        /// <summary>
+        /// Customer head name. For identification usage.
+        /// </summary>
+        public string Name { get; set; } = null!;
+        /// <summary>
+        /// Customer tax number (business identifier)
+        /// </summary>
+        public string? TaxNumber { get; set; }
+        /// <summary>
+        /// Customer VAT number (VAT identification)
+        /// </summary>
+        public string? VatNumber { get; set; }
+        /// <summary>
+        /// Flag if VAT calculation is allowed
+        /// </summary>
+        public bool? VatIncluded { get; set; }
+        /// <summary>
+        /// Tax country region code
+        /// </summary>
+        public string TaxCountryCode { get; set; } = null!;
+
+
+    }
+
+    public class CustomerWDto : QlbrcDtoWithoutId, IUpdateDto, ICreateDto
+    {
+        /// <summary>
+        /// Customer head name. For identification usage.
+        /// </summary>
+        public string Name { get; set; } = null!;
+        /// <summary>
+        /// Customer tax number (business identifier)
+        /// </summary>
+        public string? TaxNumber { get; set; }
+        /// <summary>
+        /// Customer VAT number (VAT identification)
+        /// </summary>
+        public string? VatNumber { get; set; }
+        /// <summary>
+        /// Flag if VAT calculation is allowed
+        /// </summary>
+        public bool? VatIncluded { get; set; }
+        /// <summary>
+        /// Tax country region code
+        /// </summary>
+        public string TaxCountryCode { get; set; } = null!;
+
+        
+    }
+
+    public class CustomerDDto : QlbrcDtoWithId, IDeleteDto
+    {
+    }
+}

+ 3 - 2
Modules/qdr.app.qlbrc.customer/Entities/Contact.cs

@@ -1,4 +1,5 @@
 using Quadarax.Application.QLiberace.Common.Entities.Base;
+using Quadarax.Application.QLiberace.Customer.Enums;
 
 namespace Quadarax.Application.QLiberace.Customer.Entities
 {
@@ -11,7 +12,7 @@ namespace Quadarax.Application.QLiberace.Customer.Entities
         /// <summary>
         /// Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)
         /// </summary>
-        public int Type { get; set; }
+        public ContactTypeEnum Type { get; set; }
         /// <summary>
         /// Contact heading caption.
         /// </summary>
@@ -39,7 +40,7 @@ namespace Quadarax.Application.QLiberace.Customer.Entities
         /// <summary>
         /// Flag if Contact is preffered.
         /// </summary>
-        public bool IsPreffered { get; set; }
+        public bool IsPreferred { get; set; }
 
         public virtual Customer Customer { get; set; } = null!;
 

+ 4 - 2
Modules/qdr.app.qlbrc.customer/Entities/DaoMapper/ContactDm.cs

@@ -1,6 +1,7 @@
 using Microsoft.EntityFrameworkCore;
 using Quadarax.Application.QLiberace.Base;
 using Quadarax.Application.QLiberace.Common.Entities.Base.DaoMapper;
+using Quadarax.Application.QLiberace.Customer.Enums;
 
 namespace Quadarax.Application.QLiberace.Customer.Entities.DaoMapper
 {
@@ -40,14 +41,15 @@ namespace Quadarax.Application.QLiberace.Customer.Entities.DaoMapper
                 entity.Property(e => e.CustomerId).IsRequired()
                     .HasComment("Reference to customer that contact belongs");
 
-                entity.Property(e => e.IsPreffered).IsRequired()
+                entity.Property(e => e.IsPreferred).IsRequired()
                     .HasDefaultValueSql("0")
                     .HasComment("Flag if Contact is preffered.");
 
                 
                 entity.Property(e => e.Type).IsRequired()
                     .HasDefaultValueSql("0")
-                    .HasComment("Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)");
+                    .HasComment("Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)")
+                    .HasConversion<int>();
 
                 entity.Property(e => e.Zip)
                     .HasMaxLength(20)

+ 10 - 0
Modules/qdr.app.qlbrc.customer/Enums/ContactTypeEnum.cs

@@ -0,0 +1,10 @@
+namespace Quadarax.Application.QLiberace.Customer.Enums
+{
+    public enum ContactTypeEnum
+    {
+        Email = 0,
+        Address = 1,
+        Phone = 2,
+        Sms = 3
+    }
+}

+ 107 - 0
Modules/qdr.app.qlbrc.customer/Services/CustomerService.cs

@@ -0,0 +1,107 @@
+using Microsoft.Extensions.Logging;
+using Quadarax.Application.QLiberace.Base.Repositories;
+using Quadarax.Application.QLiberace.Customer.Dtos;
+using Quadarax.Application.QLiberace.Customer.Enums;
+using Quadarax.Application.QLiberace.Customer.Repositories;
+using Quadarax.Foundation.Core.Business;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
+
+namespace Quadarax.Application.QLiberace.Customer.Services
+{
+    public class CustomerService : AbstractMultiRepositoryService<RepoCustomer,RepoContact, RepoUser>
+    {
+        #region *** Constructor ***
+        public CustomerService(RepoCustomer repository1, RepoContact repository2, RepoUser repository3, IContext currentContext, ILoggerFactory logger) : base(repository1, repository2, repository3, currentContext, logger)
+        {
+        }
+        #endregion
+
+        #region *** Public operations ***
+        #region **** Customer ****
+
+        public ResultValueDto<CustomerRDto?> AddCustomer(CustomerWDto customer)
+        {
+            throw new NotImplementedException();
+        }
+
+
+        public ResultDto UpdateCustomer(string customerCode, CustomerWDto customer)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultDto DeleteCustomer(long customerId)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultValueDto<CustomerRDto?> GetCustomer(string customerCode)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultValueDto<CustomerRDto?> GetCustomer(long customerId)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultBoolDto ExistsCustomer(string customerCode)
+        {
+            throw new NotImplementedException();
+        }
+        #endregion
+
+        #region **** User Assignments ****
+        public ResultDto AssignUser(string customerCode, string userLogin)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultDto UnAssignUser(string customerCode, string userLogin)
+        {
+            throw new NotImplementedException();
+        }
+        #endregion
+
+        #region **** Customer Constacts ****
+        public ResultValueDto<ContactRDto?> AddContact(string customerCode, ContactWDto contact)
+        {
+            throw new NotImplementedException();
+        }
+        public ResultDto UpdateContact(string customerCode, ContactWDto contact)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultDto DeleteContact(long contactId)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultValueDto<ContactRDto?> GetContact(long contactId)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultsValueDto<ContactRDto?> GetContacts(string customerCode)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultsValueDto<ContactRDto?> GetPreferredContacts(string customerCode, params ContactTypeEnum[] contactTypes)
+        {
+            throw new NotImplementedException();
+        }
+
+        public ResultDto ValidateContacts(string customerCode)
+        {
+            throw new NotImplementedException();
+        }
+        #endregion
+        #endregion
+
+    }
+
+
+}

+ 4 - 0
Modules/qdr.app.qlbrc.customer/qdr.app.qlbrc.customer.csproj

@@ -14,4 +14,8 @@
     <ProjectReference Include="..\qdr.app.qlbrc.base\qdr.app.qlbrc.base.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Dtos\Validators\" />
+  </ItemGroup>
+
 </Project>

+ 17 - 5
qdr.app.qlbrc.console/Commands/Base/DbContextCommand.cs

@@ -1,16 +1,22 @@
 using Microsoft.Data.SqlClient;
+using Microsoft.EntityFrameworkCore;
 using Quadarax.Application.QLiberace.Base;
+using Quadarax.Application.QLiberace.Customer;
 using Quadarax.Foundation.Core.QConsole.Command.Base;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.Value;
-using Microsoft.EntityFrameworkCore;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 
 namespace Quadarax.Application.QLiberace.Console.Commands.Base
 {
     internal abstract class DbContextCommand : AbstractCommand
     {
         #region *** Properties ***
+        #endregion
+
 
+        #region *** Private fields ***
         #endregion
 
         #region *** Constructor ***
@@ -23,14 +29,20 @@ namespace Quadarax.Application.QLiberace.Console.Commands.Base
         #region *** EXECUTE ***
         protected override Result OnExecute()
         {
-            var options = new DbContextOptions<QlbrcDbContext>();
-            using (var context = new QlbrcDbContext(options))
+            using (var dcResolver = new DomainContextResolver())
             {
-                return OnExecute(context);
+                RegisterDbContext(dcResolver);
+                return OnExecute(dcResolver);
             }
         }
 
-        protected abstract Result OnExecute(QlbrcDbContext context);
+        protected abstract Result OnExecute(IDomainContextResolver resolver);
+
+        protected virtual void RegisterDbContext(IDomainContextResolver rcResolver)
+        {
+            rcResolver.Register(new QlbrcDbContext(new DbContextOptions<QlbrcDbContext>()));
+            rcResolver.Register(new QlbrcDbContextCustomer(new DbContextOptions<QlbrcDbContextCustomer>()));
+        }
         #endregion
 
         #region *** Private operations ***

+ 2 - 2
qdr.app.qlbrc.console/Commands/Base/DbMigrationCommand.cs

@@ -29,7 +29,7 @@ namespace Quadarax.Application.QLiberace.Console.Commands.Base
 
         #region *** Private operations ***
         //src: https://makolyte.com/ef-core-apply-migrations-programmatically/
-        protected void ApplyMigration(QlbrcDbContext context, string? migrationCode = null)
+        protected void ApplyMigration(DbContext context, string? migrationCode = null)
         {
             var migrator = context.GetInfrastructure().GetService<IMigrator>();
             if (migrator == null)
@@ -40,7 +40,7 @@ namespace Quadarax.Application.QLiberace.Console.Commands.Base
             WriteInfo($"You're now on schema version: {lastAppliedMigration}");
         }
 
-        protected bool CheckPendingMigrations(QlbrcDbContext context)
+        protected bool CheckPendingMigrations(DbContext context)
         {
             return context.Database.GetPendingMigrations().Any();
         }

+ 19 - 13
qdr.app.qlbrc.console/Commands/DbClearCmd.cs

@@ -1,6 +1,8 @@
 using Microsoft.Data.SqlClient;
+using Microsoft.EntityFrameworkCore;
 using Quadarax.Application.QLiberace.Base;
 using Quadarax.Application.QLiberace.Console.Commands.Base;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Attributes;
 using Quadarax.Foundation.Core.Value;
@@ -28,25 +30,29 @@ namespace Quadarax.Application.QLiberace.Console.Commands
         #endregion
         
         #region *** EXECUTE ***
-        protected override Result OnExecute(QlbrcDbContext context)
+        protected override Result OnExecute(IDomainContextResolver resolver)
         {
-            WriteInfo("Connecting database...");
             var resultCode = 0;
-            try
+            foreach (var contextCode in resolver.RegisteredContexts)
             {
-                if (context.Database.CanConnect())
+                var context = (DbContext)resolver.Get(contextCode);
+                WriteInfo($"Connecting database [{context.Database.GetDbConnection().Database}]...");
+                try
                 {
-                    WriteInfo("Deleting database...");
-                    context.Database.EnsureDeleted();
+                    if (context.Database.CanConnect())
+                    {
+                        WriteInfo("Deleting database...");
+                        context.Database.EnsureDeleted();
+                    }
+                    WriteInfo("Creating database...");
+                    context.Database.EnsureCreated();
+                }
+                catch (SqlException e)
+                {
+                    return HandleConnectionException(e);
                 }
-                WriteInfo("Creating database...");
-                context.Database.EnsureCreated();
-            }
-            catch (SqlException e)
-            {
-                return HandleConnectionException(e);
-            }
 
+            }
             return new Result(resultCode);
         }
 

+ 4 - 9
qdr.app.qlbrc.console/Commands/DbInitCmd.cs

@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.Data.SqlClient;
+using Microsoft.Data.SqlClient;
 using Quadarax.Application.QLiberace.Base;
 using Quadarax.Application.QLiberace.Base.Entities;
 using Quadarax.Application.QLiberace.Base.Repositories;
@@ -11,6 +6,7 @@ using Quadarax.Application.QLiberace.Common.Domain;
 using Quadarax.Application.QLiberace.Console.Commands.Base;
 using Quadarax.Foundation.Core.Data;
 using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Attributes;
 using Quadarax.Foundation.Core.Value;
@@ -42,14 +38,13 @@ namespace Quadarax.Application.QLiberace.Console.Commands
 
         #region *** EXECUTE ***
 
-        protected override Result OnExecute(QlbrcDbContext context)
+        protected override Result OnExecute(IDomainContextResolver resolver)
         {
             WriteInfo("Initializing database data...");
             var resultCode = Constants.ReturnCodes.Ok;
             try
             {
-                var dbcResolver = new DomainContextResolver<QlbrcDbContext>(context);
-                var uow = new UnitOfWork<QlbrcDbContext>(dbcResolver);
+                var uow = new UnitOfWork<QlbrcDbContext>(resolver);
 
                 var rtenant = new RepoTenant(uow.As<IDataDomain>(), new QlbrcContext(null, null, 1));
 

+ 30 - 24
qdr.app.qlbrc.console/Commands/DbInstallCmd.cs

@@ -1,6 +1,7 @@
 using Microsoft.Data.SqlClient;
-using Quadarax.Application.QLiberace.Base;
+using Microsoft.EntityFrameworkCore;
 using Quadarax.Application.QLiberace.Console.Commands.Base;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.QConsole.Attributes;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Argument;
@@ -32,41 +33,46 @@ namespace Quadarax.Application.QLiberace.Console.Commands
         #endregion
         
         #region *** EXECUTE ***
-        protected override Result OnExecute(QlbrcDbContext context)
+        protected override Result OnExecute(IDomainContextResolver resolver)
         {
-            WriteInfo("Ensuring database...");
+
             var resultCode = Constants.ReturnCodes.Ok;
-            try
+            foreach (var contextCode in resolver.RegisteredContexts)
             {
-                if (!context.Database.EnsureCreated())
-                {
-                    WriteInfo("Database already exists.");
-                    resultCode = Constants.Commands.DbInstall.ReturnCodes.DatabaseExists;
-                }
-                else
-                {
-                    WriteWarning("Database created.");
-                }
+                var context = (DbContext)resolver.Get(contextCode);
+                WriteInfo($"Ensuring database [{context.Database.GetDbConnection().Database}]...");
 
-                if (_isLatestUpdateEnabled)
+                try
                 {
-                    WriteInfo("Checking pending migrations.");
-                    if (CheckPendingMigrations(context))
+                    if (!context.Database.EnsureCreated())
                     {
-                        WriteInfo("New pending migrations detected.");
-                        ApplyMigration(context);
+                        WriteInfo("Database already exists.");
+                        resultCode = Constants.Commands.DbInstall.ReturnCodes.DatabaseExists;
                     }
                     else
                     {
-                        WriteInfo("Nothing found.");
+                        WriteWarning("Database created.");
+                    }
+
+                    if (_isLatestUpdateEnabled)
+                    {
+                        WriteInfo("Checking pending migrations.");
+                        if (CheckPendingMigrations(context))
+                        {
+                            WriteInfo("New pending migrations detected.");
+                            ApplyMigration(context);
+                        }
+                        else
+                        {
+                            WriteInfo("Nothing found.");
+                        }
                     }
                 }
+                catch (SqlException e)
+                {
+                    return HandleConnectionException(e);
+                }
             }
-            catch (SqlException e)
-            {
-                return HandleConnectionException(e);
-            }
-
             return new Result(resultCode);
         }
 

+ 23 - 14
qdr.app.qlbrc.console/Commands/DbUninstallCmd.cs

@@ -1,6 +1,8 @@
 using Microsoft.Data.SqlClient;
+using Microsoft.EntityFrameworkCore;
 using Quadarax.Application.QLiberace.Base;
 using Quadarax.Application.QLiberace.Console.Commands.Base;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Attributes;
 using Quadarax.Foundation.Core.Value;
@@ -29,27 +31,33 @@ namespace Quadarax.Application.QLiberace.Console.Commands
         #endregion
         
         #region *** EXECUTE ***
-        protected override Result OnExecute(QlbrcDbContext context)
+        protected override Result OnExecute(IDomainContextResolver resolver)
         {
-            WriteInfo("Connecting database...");
             var resultCode = 0;
-            try
+
+            foreach (var contextCode in resolver.RegisteredContexts)
             {
-                if (context.Database.CanConnect())
+                var context = (DbContext)resolver.Get(contextCode);
+                WriteInfo($"Connecting database [{context.Database.GetDbConnection().Database}]...");
+
+                try
                 {
-                    WriteInfo("Deleting database...");
-                    context.Database.EnsureDeleted();
+                    if (context.Database.CanConnect())
+                    {
+                        WriteInfo("Deleting database...");
+                        context.Database.EnsureDeleted();
+                    }
+                    else
+                    {
+                        resultCode = DbUninstall.ReturnCodes.DatabaseNotExists;
+                        WriteWarning("Database not exists.");
+                    }
+
                 }
-                else
+                catch (SqlException e)
                 {
-                    resultCode = DbUninstall.ReturnCodes.DatabaseNotExists;
-                    WriteWarning("Database not exists.");
+                    return HandleConnectionException(e);
                 }
-
-            }
-            catch (SqlException e)
-            {
-                return HandleConnectionException(e);
             }
 
             return new Result(resultCode);
@@ -60,6 +68,7 @@ namespace Quadarax.Application.QLiberace.Console.Commands
 
         #region *** Private operations ***
         #endregion
+
     }
 
 }

+ 29 - 24
qdr.app.qlbrc.console/Commands/DbUpdateCmd.cs

@@ -1,11 +1,11 @@
 using Microsoft.Data.SqlClient;
-using Quadarax.Application.QLiberace.Base;
 using Quadarax.Application.QLiberace.Console.Commands.Base;
 using Quadarax.Foundation.Core.QConsole.Argument;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.Value;
 using Microsoft.EntityFrameworkCore;
 using Quadarax.Foundation.Core.QConsole.Attributes;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 
 namespace Quadarax.Application.QLiberace.Console.Commands
 {
@@ -31,47 +31,52 @@ namespace Quadarax.Application.QLiberace.Console.Commands
         #endregion
         
         #region *** EXECUTE ***
-        protected override Result OnExecute(QlbrcDbContext context)
+        protected override Result OnExecute(IDomainContextResolver resolver)
         {
-            WriteInfo("Connecting database...");
+
             var resultCode = 0;
-            try
+            foreach (var contextCode in resolver.RegisteredContexts)
             {
-                if (context.Database.CanConnect())
+                var context = (DbContext)resolver.Get(contextCode);
+                WriteInfo($"Connecting database [{context.Database.GetDbConnection().Database}]...");
+
+                try
                 {
-                    if (_isListOnly)
+                    if (context.Database.CanConnect())
                     {
-                        WriteInfo("Pending migrations list:");
-                        var migrations = context.Database.GetPendingMigrations().ToArray();
-                        if (migrations.Length > 0)
+                        if (_isListOnly)
                         {
-                            foreach (var mig in migrations)
-                                WriteInfo(mig);
+                            WriteInfo("Pending migrations list:");
+                            var migrations = context.Database.GetPendingMigrations().ToArray();
+                            if (migrations.Length > 0)
+                            {
+                                foreach (var mig in migrations)
+                                    WriteInfo(mig);
+                            }
+                            else
+                            {
+                                WriteInfo("No pending migrations present.");
+                            }
+
+                            WriteWarning("No migration applied.");
                         }
                         else
                         {
-                            WriteInfo("No pending migrations present.");
+                            ApplyMigration(context);
+                            WriteWarning("Migration applied.");
                         }
-
-                        WriteWarning("No migration applied.");
                     }
                     else
                     {
-                        ApplyMigration(context);
-                        WriteWarning("Migration applied.");
+                        WriteWarning("Database doesn't exists. Use db_install first.");
+                        return new Result(Constants.Commands.DbUpdate.ReturnCodes.DatabaseNotExists);
                     }
                 }
-                else
+                catch (SqlException e)
                 {
-                    WriteWarning("Database doesn't exists. Use db_install first.");
-                    return new Result(Constants.Commands.DbUpdate.ReturnCodes.DatabaseNotExists); 
+                    return HandleConnectionException(e);
                 }
             }
-            catch (SqlException e)
-            {
-                return HandleConnectionException(e);
-            }
-
             return new Result(resultCode);
         }
 

+ 3 - 3
qdr.app.qlbrc.console/TestCmd.cs

@@ -8,6 +8,7 @@ using Quadarax.Foundation.Core.QConsole.Argument;
 using Quadarax.Foundation.Core.QConsole.Attributes;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.Value;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 
 namespace Quadarax.Application.QLiberace.Console
 {
@@ -33,14 +34,13 @@ namespace Quadarax.Application.QLiberace.Console
         #endregion
         
         #region *** EXECUTE ***
-        protected override Result OnExecute(QlbrcDbContext context)
+        protected override Result OnExecute(IDomainContextResolver resolver)
         {
             WriteInfo("Running test...");
             var resultCode = Constants.ReturnCodes.Ok;
             try
             {
-                var dbcResolver = new DomainContextResolver<QlbrcDbContext>(context);
-                var uow = new UnitOfWork<QlbrcDbContext>(dbcResolver);
+                var uow = new UnitOfWork<QlbrcDbContext>(resolver);
                 var repo = new RepoTenant(uow.As<IDataDomain>(), new QlbrcContext(null, null, 1));
 
                 var tenant = repo.GetByCode("default");

+ 1 - 0
qdr.app.qlbrc.console/qdr.app.qlbrc.console.csproj

@@ -20,6 +20,7 @@
     <ProjectReference Include="..\Common\qdr.fnd.core.qconsole\qdr.fnd.core.qconsole.csproj" />
     <ProjectReference Include="..\Common\qdr.fnd.core\qdr.fnd.core.csproj" />
     <ProjectReference Include="..\Modules\qdr.app.qlbrc.base\qdr.app.qlbrc.base.csproj" />
+    <ProjectReference Include="..\Modules\qdr.app.qlbrc.customer\qdr.app.qlbrc.customer.csproj" />
   </ItemGroup>
 
   <ItemGroup>