Browse Source

定义模型

El1420606 1 year ago
commit
7b29c6cb10
41 changed files with 1497 additions and 0 deletions
  1. 422 0
      .gitignore
  2. 0 0
      readme.md
  3. 9 0
      src/Electric/Electric.Application.Contracts/Electric.Application.Contracts.csproj
  4. 9 0
      src/Electric/Electric.Application/Electric.Application.csproj
  5. 9 0
      src/Electric/Electric.Domain.Shared/Electric.Domain.Shared.csproj
  6. 53 0
      src/Electric/Electric.Domain.Shared/Entities/Identity/PermissionApiMethod.cs
  7. 23 0
      src/Electric/Electric.Domain.Shared/Entities/Identity/PermissionStatus.cs
  8. 23 0
      src/Electric/Electric.Domain.Shared/Entities/Identity/PermissionType.cs
  9. 17 0
      src/Electric/Electric.Domain.Shared/Entities/Identity/RoleStatus.cs
  10. 17 0
      src/Electric/Electric.Domain.Shared/Entities/Identity/UserStatus.cs
  11. 13 0
      src/Electric/Electric.Domain/Electric.Domain.csproj
  12. 23 0
      src/Electric/Electric.Domain/Entities/Commons/AggregateRoot.cs
  13. 29 0
      src/Electric/Electric.Domain/Entities/Commons/AuditedAggregateRoot.cs
  14. 22 0
      src/Electric/Electric.Domain/Entities/Commons/CreationAuditedAggregateRoot.cs
  15. 25 0
      src/Electric/Electric.Domain/Entities/Commons/CreationAuditedEntity.cs
  16. 36 0
      src/Electric/Electric.Domain/Entities/Commons/Entity.cs
  17. 95 0
      src/Electric/Electric.Domain/Entities/Identity/ElePermission.cs
  18. 65 0
      src/Electric/Electric.Domain/Entities/Identity/EleRole.cs
  19. 33 0
      src/Electric/Electric.Domain/Entities/Identity/EleRoleClaim.cs
  20. 20 0
      src/Electric/Electric.Domain/Entities/Identity/EleRolePermission.cs
  21. 140 0
      src/Electric/Electric.Domain/Entities/Identity/EleUser.cs
  22. 22 0
      src/Electric/Electric.Domain/Entities/Identity/EleUserClaim.cs
  23. 27 0
      src/Electric/Electric.Domain/Entities/Identity/EleUserLogin.cs
  24. 20 0
      src/Electric/Electric.Domain/Entities/Identity/EleUserRole.cs
  25. 30 0
      src/Electric/Electric.Domain/Entities/Identity/EleUserToken.cs
  26. 10 0
      src/Electric/Electric.EntityFrameworkCore.DbMigrations/Electric.EntityFrameworkCore.DbMigrations.csproj
  27. 6 0
      src/Electric/Electric.EntityFrameworkCore.DbMigrations/Electric.EntityFrameworkCore.DbMigrations.http
  28. 32 0
      src/Electric/Electric.EntityFrameworkCore.DbMigrations/Program.cs
  29. 31 0
      src/Electric/Electric.EntityFrameworkCore.DbMigrations/Properties/launchSettings.json
  30. 8 0
      src/Electric/Electric.EntityFrameworkCore.DbMigrations/appsettings.Development.json
  31. 9 0
      src/Electric/Electric.EntityFrameworkCore.DbMigrations/appsettings.json
  32. 9 0
      src/Electric/Electric.EntityFrameworkCore/Electric.EntityFrameworkCore.csproj
  33. 33 0
      src/Electric/Electric.WebAPI/Controllers/WeatherForecastController.cs
  34. 14 0
      src/Electric/Electric.WebAPI/Electric.WebAPI.csproj
  35. 6 0
      src/Electric/Electric.WebAPI/Electric.WebAPI.http
  36. 25 0
      src/Electric/Electric.WebAPI/Program.cs
  37. 41 0
      src/Electric/Electric.WebAPI/Properties/launchSettings.json
  38. 13 0
      src/Electric/Electric.WebAPI/WeatherForecast.cs
  39. 8 0
      src/Electric/Electric.WebAPI/appsettings.Development.json
  40. 9 0
      src/Electric/Electric.WebAPI/appsettings.json
  41. 61 0
      src/Electric/Electric.sln

+ 422 - 0
.gitignore

@@ -0,0 +1,422 @@
+    ## Ignore Visual Studio temporary files, build results, and
+    ## files generated by popular Visual Studio add-ons.
+    ##
+    ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
+
+    # User-specific files
+    *.rsuser
+    *.suo
+    *.user
+    *.userosscache
+    *.sln.docstates
+
+    # User-specific files (MonoDevelop/Xamarin Studio)
+    *.userprefs
+
+    # Mono auto generated files
+    mono_crash.*
+
+    # Build results
+    [Dd]ebug/
+    [Dd]ebugPublic/
+    [Rr]elease/
+    [Rr]eleases/
+    x64/
+    x86/
+    [Ww][Ii][Nn]32/
+    [Aa][Rr][Mm]/
+    [Aa][Rr][Mm]64/
+    bld/
+    [Bb]in/
+    [Oo]bj/
+    [Ll]og/
+    [Ll]ogs/
+
+    # Visual Studio 2015/2017 cache/options directory
+    .vs/
+    # Uncomment if you have tasks that create the project's static files in wwwroot
+    #wwwroot/
+
+    # Visual Studio 2017 auto generated files
+    Generated\ Files/
+
+    # MSTest test Results
+    [Tt]est[Rr]esult*/
+    [Bb]uild[Ll]og.*
+
+    # NUnit
+    *.VisualState.xml
+    TestResult.xml
+    nunit-*.xml
+
+    # Build Results of an ATL Project
+    [Dd]ebugPS/
+    [Rr]eleasePS/
+    dlldata.c
+
+    # Benchmark Results
+    BenchmarkDotNet.Artifacts/
+
+    # .NET Core
+    project.lock.json
+    project.fragment.lock.json
+    artifacts/
+
+    # ASP.NET Scaffolding
+    ScaffoldingReadMe.txt
+
+    # StyleCop
+    StyleCopReport.xml
+
+    # Files built by Visual Studio
+    *_i.c
+    *_p.c
+    *_h.h
+    *.ilk
+    *.meta
+    *.obj
+    *.iobj
+    *.pch
+    *.pdb
+    *.ipdb
+    *.pgc
+    *.pgd
+    *.rsp
+    *.sbr
+    *.tlb
+    *.tli
+    *.tlh
+    *.tmp
+    *.tmp_proj
+    *_wpftmp.csproj
+    *.log
+    *.tlog
+    *.vspscc
+    *.vssscc
+    .builds
+    *.pidb
+    *.svclog
+    *.scc
+
+    # Chutzpah Test files
+    _Chutzpah*
+
+    # Visual C++ cache files
+    ipch/
+    *.aps
+    *.ncb
+    *.opendb
+    *.opensdf
+    *.sdf
+    *.cachefile
+    *.VC.db
+    *.VC.VC.opendb
+
+    # Visual Studio profiler
+    *.psess
+    *.vsp
+    *.vspx
+    *.sap
+
+    # Visual Studio Trace Files
+    *.e2e
+
+    # TFS 2012 Local Workspace
+    $tf/
+
+    # Guidance Automation Toolkit
+    *.gpState
+
+    # ReSharper is a .NET coding add-in
+    _ReSharper*/
+    *.[Rr]e[Ss]harper
+    *.DotSettings.user
+
+    # TeamCity is a build add-in
+    _TeamCity*
+
+    # DotCover is a Code Coverage Tool
+    *.dotCover
+
+    # AxoCover is a Code Coverage Tool
+    .axoCover/*
+    !.axoCover/settings.json
+
+    # Coverlet is a free, cross platform Code Coverage Tool
+    coverage*.json
+    coverage*.xml
+    coverage*.info
+
+    # Visual Studio code coverage results
+    *.coverage
+    *.coveragexml
+
+    # NCrunch
+    _NCrunch_*
+    .*crunch*.local.xml
+    nCrunchTemp_*
+
+    # MightyMoose
+    *.mm.*
+    AutoTest.Net/
+
+    # Web workbench (sass)
+    .sass-cache/
+
+    # Installshield output folder
+    [Ee]xpress/
+
+    # DocProject is a documentation generator add-in
+    DocProject/buildhelp/
+    DocProject/Help/*.HxT
+    DocProject/Help/*.HxC
+    DocProject/Help/*.hhc
+    DocProject/Help/*.hhk
+    DocProject/Help/*.hhp
+    DocProject/Help/Html2
+    DocProject/Help/html
+
+    # Click-Once directory
+    publish/
+
+    # Publish Web Output
+    *.[Pp]ublish.xml
+    *.azurePubxml
+    # Note: Comment the next line if you want to checkin your web deploy settings,
+    # but database connection strings (with potential passwords) will be unencrypted
+    *.pubxml
+    *.publishproj
+
+    # Microsoft Azure Web App publish settings. Comment the next line if you want to
+    # checkin your Azure Web App publish settings, but sensitive information contained
+    # in these scripts will be unencrypted
+    PublishScripts/
+
+    # NuGet Packages
+    *.nupkg
+    # NuGet Symbol Packages
+    *.snupkg
+    # The packages folder can be ignored because of Package Restore
+    **/[Pp]ackages/*
+    # except build/, which is used as an MSBuild target.
+    !**/[Pp]ackages/build/
+    # Uncomment if necessary however generally it will be regenerated when needed
+    #!**/[Pp]ackages/repositories.config
+    # NuGet v3's project.json files produces more ignorable files
+    *.nuget.props
+    *.nuget.targets
+
+    # Microsoft Azure Build Output
+    csx/
+    *.build.csdef
+
+    # Microsoft Azure Emulator
+    ecf/
+    rcf/
+
+    # Windows Store app package directories and files
+    AppPackages/
+    BundleArtifacts/
+    Package.StoreAssociation.xml
+    _pkginfo.txt
+    *.appx
+    *.appxbundle
+    *.appxupload
+
+    # Visual Studio cache files
+    # files ending in .cache can be ignored
+    *.[Cc]ache
+    # but keep track of directories ending in .cache
+    !?*.[Cc]ache/
+
+    # Others
+    ClientBin/
+    ~$*
+    *~
+    *.dbmdl
+    *.dbproj.schemaview
+    *.jfm
+    *.pfx
+    *.publishsettings
+    orleans.codegen.cs
+
+    # Including strong name files can present a security risk
+    # (https://github.com/github/gitignore/pull/2483#issue-259490424)
+    #*.snk
+
+    # Since there are multiple workflows, uncomment next line to ignore bower_components
+    # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+    #bower_components/
+
+    # RIA/Silverlight projects
+    Generated_Code/
+
+    # Backup & report files from converting an old project file
+    # to a newer Visual Studio version. Backup files are not needed,
+    # because we have git ;-)
+    _UpgradeReport_Files/
+    Backup*/
+    UpgradeLog*.XML
+    UpgradeLog*.htm
+    ServiceFabricBackup/
+    *.rptproj.bak
+
+    # SQL Server files
+    *.mdf
+    *.ldf
+    *.ndf
+
+    # Business Intelligence projects
+    *.rdl.data
+    *.bim.layout
+    *.bim_*.settings
+    *.rptproj.rsuser
+    *- [Bb]ackup.rdl
+    *- [Bb]ackup ([0-9]).rdl
+    *- [Bb]ackup ([0-9][0-9]).rdl
+
+    # Microsoft Fakes
+    FakesAssemblies/
+
+    # GhostDoc plugin setting file
+    *.GhostDoc.xml
+
+    # Node.js Tools for Visual Studio
+    .ntvs_analysis.dat
+    node_modules/
+
+    # Visual Studio 6 build log
+    *.plg
+
+    # Visual Studio 6 workspace options file
+    *.opt
+
+    # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+    *.vbw
+
+    # Visual Studio 6 auto-generated project file (contains which files were open etc.)
+    *.vbp
+
+    # Visual Studio 6 workspace and project file (working project files containing files to include in project)
+    *.dsw
+    *.dsp
+
+    # Visual Studio 6 technical files
+    *.ncb
+    *.aps
+
+    # Visual Studio LightSwitch build output
+    **/*.HTMLClient/GeneratedArtifacts
+    **/*.DesktopClient/GeneratedArtifacts
+    **/*.DesktopClient/ModelManifest.xml
+    **/*.Server/GeneratedArtifacts
+    **/*.Server/ModelManifest.xml
+    _Pvt_Extensions
+
+    # Paket dependency manager
+    .paket/paket.exe
+    paket-files/
+
+    # FAKE - F# Make
+    .fake/
+
+    # CodeRush personal settings
+    .cr/personal
+
+    # Python Tools for Visual Studio (PTVS)
+    __pycache__/
+    *.pyc
+
+    # Cake - Uncomment if you are using it
+    # tools/**
+    # !tools/packages.config
+
+    # Tabs Studio
+    *.tss
+
+    # Telerik's JustMock configuration file
+    *.jmconfig
+
+    # BizTalk build output
+    *.btp.cs
+    *.btm.cs
+    *.odx.cs
+    *.xsd.cs
+
+    # OpenCover UI analysis results
+    OpenCover/
+
+    # Azure Stream Analytics local run output
+    ASALocalRun/
+
+    # MSBuild Binary and Structured Log
+    *.binlog
+
+    # NVidia Nsight GPU debugger configuration file
+    *.nvuser
+
+    # MFractors (Xamarin productivity tool) working folder
+    .mfractor/
+
+    # Local History for Visual Studio
+    .localhistory/
+
+    # Visual Studio History (VSHistory) files
+    .vshistory/
+
+    # BeatPulse healthcheck temp database
+    healthchecksdb
+
+    # Backup folder for Package Reference Convert tool in Visual Studio 2017
+    MigrationBackup/
+
+    # Ionide (cross platform F# VS Code tools) working folder
+    .ionide/
+
+    # Fody - auto-generated XML schema
+    FodyWeavers.xsd
+
+    # VS Code files for those working on multiple tools
+    .vscode/*
+    !.vscode/settings.json
+    !.vscode/tasks.json
+    !.vscode/launch.json
+    !.vscode/extensions.json
+    *.code-workspace
+
+    # Local History for Visual Studio Code
+    .history/
+
+    # Windows Installer files from build outputs
+    *.cab
+    *.msi
+    *.msix
+    *.msm
+    *.msp
+
+    # JetBrains Rider
+    *.sln.iml
+    *.idea
+
+    **/wwwroot/upload
+/src/Electric/.vs/Electric
+/src/Electric/Electric.Application.Contracts/obj/Debug/net8.0
+/src/Electric/Electric.Domain/obj
+/src/Electric/Electric.Domain.Shared/obj
+/src/Electric/Electric.EntityFrameworkCore/obj
+/src/Electric/Electric.EntityFrameworkCore.DbMigrations/obj
+/src/Electric/Electric.WebAPI/obj
+*.user
+/src/Electric/Electric.Application/obj/Debug/net8.0
+/src/Electric/Electric.Application/obj
+/src/Electric/Electric.Application/bin/Debug/net8.0
+/src/Electric/Electric.Application.Contracts/bin/Debug/net8.0
+/src/Electric/Electric.Application.Contracts/obj
+/src/Electric/Electric.Domain/bin/Debug/net8.0
+/src/Electric/Electric.Domain.Shared/bin/Debug/net8.0
+/src/Electric/Electric.EntityFrameworkCore/bin/Debug/net8.0
+/src/Electric/Electric.EntityFrameworkCore.DbMigrations/bin/Debug/net8.0
+/src/Electric/Electric.WebAPI/bin/Debug/net8.0
+bin
+obj
+*.bin

+ 0 - 0
readme.md


+ 9 - 0
src/Electric/Electric.Application.Contracts/Electric.Application.Contracts.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>

+ 9 - 0
src/Electric/Electric.Application/Electric.Application.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>

+ 9 - 0
src/Electric/Electric.Domain.Shared/Electric.Domain.Shared.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>

+ 53 - 0
src/Electric/Electric.Domain.Shared/Entities/Identity/PermissionApiMethod.cs

@@ -0,0 +1,53 @@
+namespace Electric.Domain.Shared.Entities.Identity
+{
+    /// <summary>
+    /// 权限API方法
+    /// </summary>
+    public enum PermissionApiMethod
+    {
+        /// <summary>
+        /// GET
+        /// </summary>
+        GET,
+
+        /// <summary>
+        /// POST
+        /// </summary>
+        POST,
+
+        /// <summary>
+        /// DELETE
+        /// </summary>
+        DELETE,
+
+        /// <summary>
+        /// PUT
+        /// </summary>
+        PUT,
+
+        /// <summary>
+        /// PATH
+        /// </summary>
+        PATH,
+
+        /// <summary>
+        /// HEAD
+        /// </summary>
+        HEAD,
+
+        /// <summary>
+        /// OPTIONS
+        /// </summary>
+        OPTIONS,
+
+        /// <summary>
+        /// TRACE
+        /// </summary>
+        TRACE,
+
+        /// <summary>
+        /// CONNECT
+        /// </summary>
+        CONNECT
+    }
+}

+ 23 - 0
src/Electric/Electric.Domain.Shared/Entities/Identity/PermissionStatus.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Electric.Domain.Shared.Entities
+{
+    /// <summary>
+    /// 权限状态
+    /// </summary>
+    public enum PermissionStatus
+    {
+        /// 已禁用
+        /// </summary>
+        Forbidden,
+
+        /// <summary>
+        /// 正常
+        /// </summary>
+        Normal
+    }
+}

+ 23 - 0
src/Electric/Electric.Domain.Shared/Entities/Identity/PermissionType.cs

@@ -0,0 +1,23 @@
+namespace Electric.Domain.Shared.Entities
+{
+    /// <summary>
+    /// 权限类型
+    /// </summary>
+    public enum PermissionType
+    {
+        /// <summary>
+        /// 菜单
+        /// </summary>
+        Menu,
+
+        /// <summary>
+        /// 按钮/功能
+        /// </summary>
+        Element,
+
+        /// <summary>
+        /// API接口
+        /// </summary>
+        API
+    }
+}

+ 17 - 0
src/Electric/Electric.Domain.Shared/Entities/Identity/RoleStatus.cs

@@ -0,0 +1,17 @@
+namespace Electric.Domain.Shared.Entities
+{
+    /// <summary>
+    /// 角色状态
+    /// </summary>
+    public enum RoleStatus
+    {
+        /// 已禁用
+        /// </summary>
+        Forbidden,
+
+        /// <summary>
+        /// 正常
+        /// </summary>
+        Normal
+    }
+}

+ 17 - 0
src/Electric/Electric.Domain.Shared/Entities/Identity/UserStatus.cs

@@ -0,0 +1,17 @@
+namespace Electric.Domain.Shared.Entities
+{
+    /// <summary>
+    /// 用户状态
+    /// </summary>
+    public enum UserStatus
+    {
+        /// 已禁用
+        /// </summary>
+        Forbidden,
+
+        /// <summary>
+        /// 正常
+        /// </summary>
+        Normal
+    }
+}

+ 13 - 0
src/Electric/Electric.Domain/Electric.Domain.csproj

@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Electric.Domain.Shared\Electric.Domain.Shared.csproj" />
+  </ItemGroup>
+
+</Project>

+ 23 - 0
src/Electric/Electric.Domain/Entities/Commons/AggregateRoot.cs

@@ -0,0 +1,23 @@
+namespace Electric.Domain.Entities.Commons
+{
+    /// <summary>
+    /// 聚合根
+    /// </summary>
+    /// <typeparam name="TKey">主键</typeparam>
+    public class AggregateRoot<TKey> : Entity<TKey>
+    {
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        public AggregateRoot()
+        { }
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="id"></param>
+        public AggregateRoot(TKey id) : base(id)
+        {
+        }
+    }
+}

+ 29 - 0
src/Electric/Electric.Domain/Entities/Commons/AuditedAggregateRoot.cs

@@ -0,0 +1,29 @@
+namespace Electric.Domain.Entities.Commons
+{
+    /// <summary>
+    /// 包含审计信息的聚合根
+    /// </summary>
+    /// <typeparam name="TKey">主键</typeparam>
+    public class AuditedAggregateRoot<TKey> : CreationAuditedAggregateRoot<TKey>
+    {
+        /// <summary>
+        /// 修改时间
+        /// </summary>
+        public DateTime? LastModificationTime { get; set; }
+
+        /// <summary>
+        /// 最后修改者
+        /// </summary>
+
+        public TKey? LastModifierId { get; set; }
+
+        protected AuditedAggregateRoot()
+        {
+        }
+
+        protected AuditedAggregateRoot(TKey id)
+            : base(id)
+        {
+        }
+    }
+}

+ 22 - 0
src/Electric/Electric.Domain/Entities/Commons/CreationAuditedAggregateRoot.cs

@@ -0,0 +1,22 @@
+namespace Electric.Domain.Entities.Commons
+{
+    /// <summary>
+    /// 包含创建审计信息的聚合根
+    /// </summary>
+    /// <typeparam name="TKey">主键</typeparam>
+    public class CreationAuditedAggregateRoot<TKey> : AggregateRoot<TKey>
+    {
+        public DateTime CreationTime { get; set; }
+
+        public Guid? CreatorId { get; set; }
+
+        protected CreationAuditedAggregateRoot()
+        {
+        }
+
+        protected CreationAuditedAggregateRoot(TKey id)
+            : base(id)
+        {
+        }
+    }
+}

+ 25 - 0
src/Electric/Electric.Domain/Entities/Commons/CreationAuditedEntity.cs

@@ -0,0 +1,25 @@
+namespace Electric.Domain.Entities.Commons
+{
+    /// <summary>
+    /// 包含创建审计信息的实体
+    /// </summary>
+    /// <typeparam name="TKey"></typeparam>
+    public class CreationAuditedEntity<TKey> : Entity
+    {
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 创建者
+        /// </summary>
+
+        public TKey? CreatorId { get; set; }
+
+        protected CreationAuditedEntity()
+        {
+            CreationTime = DateTime.Now;
+        }
+    }
+}

+ 36 - 0
src/Electric/Electric.Domain/Entities/Commons/Entity.cs

@@ -0,0 +1,36 @@
+namespace Electric.Domain.Entities.Commons
+{
+    /// <summary>
+    /// 实体
+    /// </summary>
+    public class Entity
+    {
+    }
+
+    /// <summary>
+    /// 带主键的实体
+    /// </summary>
+    /// <typeparam name="TKey">主键</typeparam>
+    public class Entity<TKey> : Entity
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        public TKey Id { get; protected set; }
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        protected Entity()
+        {
+        }
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        protected Entity(TKey id)
+        {
+            Id = id;
+        }
+    }
+}

+ 95 - 0
src/Electric/Electric.Domain/Entities/Identity/ElePermission.cs

@@ -0,0 +1,95 @@
+using Electric.Domain.Entities.Commons;
+using Electric.Domain.Shared.Entities;
+using Electric.Domain.Shared.Entities.Identity;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Permissions;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Electric.Domain.Entities.Identity
+{
+    public class ElePermission : AuditedAggregateRoot<Guid>
+    {
+        /// <summary>
+        /// 权限名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 权限编码
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// Url地址
+        /// </summary>
+        public string? Url { get; set; }
+
+        /// <summary>
+        /// Vue页面组件
+        /// </summary>
+        public string? Component { get; set; }
+
+        /// <summary>
+        /// 图标
+        /// </summary>
+        public string? Icon { get; set; }
+
+        /// <summary>
+        /// 菜单类型:菜单权限、元素权限、Api权限、数据权限
+        /// </summary>
+        public PermissionType PermissionType { get; set; }
+
+        /// <summary>
+        /// API方法
+        /// </summary>
+        public string ApiMethod { get; protected set; }
+
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int Sort { get; set; }
+
+        /// <summary>
+        /// 父菜单Id
+        /// </summary>
+        public long ParentId { get; set; }
+
+        /// <summary>
+        /// 状态,0:禁用,1:正常
+        /// </summary>
+        public PermissionStatus Status { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Remark { get; set; }
+
+        protected ElePermission()
+        {
+        }
+
+        public ElePermission(long parentId, Guid id, string name, string url, PermissionType permissionType, PermissionApiMethod apiMethod, PermissionStatus permissionStatus) : base(id)
+        {
+            ParentId = parentId;
+            Name = name;
+            Url = url;
+            PermissionType = permissionType;
+            ApiMethod = apiMethod.ToString();
+            Status = permissionStatus;
+            Sort = 0;
+        }
+
+        /// <summary>
+        /// 设置API方法
+        /// </summary>
+        /// <param name="apiMethod"></param>
+        public void SetApiMethod(PermissionApiMethod apiMethod)
+        {
+            ApiMethod = apiMethod.ToString();
+        }
+    }
+}

+ 65 - 0
src/Electric/Electric.Domain/Entities/Identity/EleRole.cs

@@ -0,0 +1,65 @@
+using Electric.Domain.Entities.Commons;
+using Electric.Domain.Shared.Entities;
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Electric.Domain.Entities.Identity
+{
+    public class EleRole : AuditedAggregateRoot<Guid>
+    {
+        /// <summary>
+        /// 角色名称
+        /// </summary>
+        public virtual string? Name { get; set; }
+
+        /// <summary>
+        /// 标准化角色名称
+        /// </summary>
+        public virtual string? NormalizedName { get; set; }
+
+        /// <summary>
+        /// 一个随机值,只要角色被持久化到存储中,该值就应该更改
+        /// </summary>
+        public virtual string? ConcurrencyStamp { get; set; }
+
+        /// <summary>
+        /// 状态,0:禁用,1:正常
+        /// </summary>
+        public RoleStatus Status { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Remark { get; set; }
+
+        /// <summary>
+        /// 声明列表
+        /// </summary>
+        public ICollection<EleRoleClaim> Claims { get; protected set; }
+
+        /// <summary>
+        /// 权限列表
+        /// </summary>
+        public ICollection<EleRolePermission> Permissions { get; protected set; }
+
+        protected EleRole()
+        {
+        }
+
+        public EleRole(Guid id, string name) : base(id)
+        {
+            Name = name;
+            NormalizedName = name.ToUpperInvariant();
+            ConcurrencyStamp = Guid.NewGuid().ToString("N");
+            Status = RoleStatus.Normal;
+
+            Claims = new Collection<EleRoleClaim>();
+            Permissions = new Collection<EleRolePermission>();
+        }
+    }
+}

+ 33 - 0
src/Electric/Electric.Domain/Entities/Identity/EleRoleClaim.cs

@@ -0,0 +1,33 @@
+using Electric.Domain.Entities.Commons;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Electric.Domain.Entities.Identity
+{
+    public class EleRoleClaim : Entity
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 角色Id
+        /// </summary>
+        public Guid RoleId { get; set; }
+
+        /// <summary>
+        /// 声明类型
+        /// </summary>
+        public string? ClaimType { get; set; }
+
+        /// <summary>
+        /// 类型值
+        /// </summary>
+        public string? ClaimValue { get; set; }
+    }
+}

+ 20 - 0
src/Electric/Electric.Domain/Entities/Identity/EleRolePermission.cs

@@ -0,0 +1,20 @@
+using Electric.Domain.Entities.Commons;
+
+namespace Electric.Domain.Entities.Identity
+{
+    /// <summary>
+    /// 角色权限关联
+    /// </summary>
+    public class EleRolePermission : CreationAuditedEntity<Guid>
+    {
+        /// <summary>
+        /// 角色Id
+        /// </summary>
+        public Guid RoleId { get; set; }
+
+        /// <summary>
+        /// 菜单Id
+        /// </summary>
+        public Guid PermissionId { get; set; }
+    }
+}

+ 140 - 0
src/Electric/Electric.Domain/Entities/Identity/EleUser.cs

@@ -0,0 +1,140 @@
+using Electric.Domain.Entities.Commons;
+using Electric.Domain.Shared.Entities;
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Electric.Domain.Entities.Identity
+{
+    public class EleUser : AuditedAggregateRoot<Guid>
+    {
+        /// <summary>
+        /// 用户名
+        /// </summary>
+        public string? UserName { get; set; }
+
+        /// <summary>
+        /// 标准化用户名
+        /// </summary>
+        public string? NormalizedUserName { get; set; }
+
+        /// <summary>
+        /// Email
+        /// </summary>
+        public string? Email { get; set; }
+
+        /// <summary>
+        /// 标准化Email
+        /// </summary>
+        public string? NormalizedEmail { get; set; }
+
+        /// <summary>
+        /// 邮箱是否确认
+        /// </summary>
+        public bool EmailConfirmed { get; set; }
+
+        /// <summary>
+        /// 密码哈希
+        /// </summary>
+        public string? PasswordHash { get; set; }
+
+        /// <summary>
+        /// 一个随机值,每当用户凭据更改时(密码更改、登录删除),该值都必须更改
+        /// </summary>
+        public string? SecurityStamp { get; set; }
+
+        /// <summary>
+        /// 一个随机值,每当用户被持久化到存储时,该值必须更改
+        /// </summary>
+        public string? ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
+
+        /// <summary>
+        /// 获取或设置用户的电话号码。
+        /// </summary>
+        public string? PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 获取或设置一个标志,该标志指示用户是否已确认其电话地址。
+        /// </summary>
+        public bool PhoneNumberConfirmed { get; set; }
+
+        /// <summary>
+        /// 获取或设置一个标志,该标志指示是否为此用户启用了双因素身份验证。
+        /// </summary>
+        public bool TwoFactorEnabled { get; set; }
+
+        /// <summary>
+        /// 获取或设置任何用户锁定结束的日期和时间(以UTC为单位)。
+        /// </summary>
+        public DateTimeOffset? LockoutEnd { get; set; }
+
+        /// <summary>
+        /// 获取或设置一个标志,该标志指示用户是否可以被锁定。
+        /// </summary>
+        public bool LockoutEnabled { get; set; }
+
+        /// <summary>
+        /// 获取或设置当前用户登录尝试失败的次数。
+        /// </summary>
+        public int AccessFailedCount { get; set; }
+
+        /// <summary>
+        /// 全名:姓名
+        /// </summary>
+        public string? FullName { get; set; }
+
+        /// <summary>
+        /// 状态,0:禁用,1:正常
+        /// </summary>
+        public UserStatus Status { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Remark { get; set; }
+
+        /// <summary>
+        /// 角色列表
+        /// </summary>
+        public ICollection<EleUserRole> Roles { get; protected set; }
+
+        /// <summary>
+        /// 用户声明列表
+        /// </summary>
+        public ICollection<EleUserClaim> Claims { get; protected set; }
+
+        /// <summary>
+        /// 用户登录列表
+        /// </summary>
+        public ICollection<EleUserLogin> Logins { get; protected set; }
+
+        /// <summary>
+        /// token列表
+        /// </summary>
+        public ICollection<EleUserToken> Tokens { get; protected set; }
+
+        protected EleUser()
+        {
+        }
+
+        public EleUser(Guid id, string userName, string email) : base(id)
+        {
+            UserName = userName;
+            NormalizedUserName = userName.ToUpperInvariant();
+            Email = email;
+            NormalizedEmail = email.ToUpperInvariant();
+            ConcurrencyStamp = Guid.NewGuid().ToString("N");
+            SecurityStamp = Guid.NewGuid().ToString();
+            Status = UserStatus.Normal;
+
+            Roles = new Collection<EleUserRole>();
+            Claims = new Collection<EleUserClaim>();
+            Logins = new Collection<EleUserLogin>();
+            Tokens = new Collection<EleUserToken>();
+        }
+    }
+}

+ 22 - 0
src/Electric/Electric.Domain/Entities/Identity/EleUserClaim.cs

@@ -0,0 +1,22 @@
+using Electric.Domain.Entities.Commons;
+
+namespace Electric.Domain.Entities.Identity
+{
+    public class EleUserClaim : Entity<Guid>
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public Guid UserId { get; set; }
+
+        /// <summary>
+        /// 声明类型
+        /// </summary>
+        public string? ClaimType { get; set; }
+
+        /// <summary>
+        /// 声明类型的值
+        /// </summary>
+        public string? ClaimValue { get; set; }
+    }
+}

+ 27 - 0
src/Electric/Electric.Domain/Entities/Identity/EleUserLogin.cs

@@ -0,0 +1,27 @@
+using Electric.Domain.Entities.Commons;
+
+namespace Electric.Domain.Entities.Identity
+{
+    public class EleUserLogin : Entity
+    {
+        /// <summary>
+        /// 登录提供程序
+        /// </summary>
+        public string LoginProvider { get; set; }
+
+        /// <summary>
+        /// ProviderKey
+        /// </summary>
+        public string ProviderKey { get; set; }
+
+        /// <summary>
+        /// 提供程序显示名称
+        /// </summary>
+        public string? ProviderDisplayName { get; set; }
+
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public Guid UserId { get; set; }
+    }
+}

+ 20 - 0
src/Electric/Electric.Domain/Entities/Identity/EleUserRole.cs

@@ -0,0 +1,20 @@
+using Electric.Domain.Entities.Commons;
+
+namespace Electric.Domain.Entities.Identity
+{
+    /// <summary>
+    /// 用户角色关联
+    /// </summary>
+    public class EleUserRole : CreationAuditedEntity<Guid>
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public Guid UserId { get; set; }
+
+        /// <summary>
+        /// 角色Id
+        /// </summary>
+        public Guid RoleId { get; set; }
+    }
+}

+ 30 - 0
src/Electric/Electric.Domain/Entities/Identity/EleUserToken.cs

@@ -0,0 +1,30 @@
+using Electric.Domain.Entities.Commons;
+
+namespace Electric.Domain.Entities.Identity
+{
+    /// <summary>
+    /// 凭证
+    /// </summary>
+    public class EleUserToken : Entity
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public Guid UserId { get; set; }
+
+        /// <summary>
+        /// 登录提供程序
+        /// </summary>
+        public string LoginProvider { get; set; }
+
+        /// <summary>
+        /// token名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// token值
+        /// </summary>
+        public string? Value { get; set; }
+    }
+}

+ 10 - 0
src/Electric/Electric.EntityFrameworkCore.DbMigrations/Electric.EntityFrameworkCore.DbMigrations.csproj

@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <InvariantGlobalization>true</InvariantGlobalization>
+  </PropertyGroup>
+
+</Project>

+ 6 - 0
src/Electric/Electric.EntityFrameworkCore.DbMigrations/Electric.EntityFrameworkCore.DbMigrations.http

@@ -0,0 +1,6 @@
+@Electric.EntityFrameworkCore.DbMigrations_HostAddress = http://localhost:5216
+
+GET {{Electric.EntityFrameworkCore.DbMigrations_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###

+ 32 - 0
src/Electric/Electric.EntityFrameworkCore.DbMigrations/Program.cs

@@ -0,0 +1,32 @@
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+
+var summaries = new[]
+{
+    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+};
+
+app.MapGet("/weatherforecast", () =>
+{
+    var forecast = Enumerable.Range(1, 5).Select(index =>
+        new WeatherForecast
+        (
+            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+            Random.Shared.Next(-20, 55),
+            summaries[Random.Shared.Next(summaries.Length)]
+        ))
+        .ToArray();
+    return forecast;
+});
+
+app.Run();
+
+internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
+{
+    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+}

+ 31 - 0
src/Electric/Electric.EntityFrameworkCore.DbMigrations/Properties/launchSettings.json

@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:8037",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "http": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "applicationUrl": "http://localhost:5216",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}

+ 8 - 0
src/Electric/Electric.EntityFrameworkCore.DbMigrations/appsettings.Development.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}

+ 9 - 0
src/Electric/Electric.EntityFrameworkCore.DbMigrations/appsettings.json

@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}

+ 9 - 0
src/Electric/Electric.EntityFrameworkCore/Electric.EntityFrameworkCore.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>

+ 33 - 0
src/Electric/Electric.WebAPI/Controllers/WeatherForecastController.cs

@@ -0,0 +1,33 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace Electric.WebAPI.Controllers
+{
+    [ApiController]
+    [Route("[controller]")]
+    public class WeatherForecastController : ControllerBase
+    {
+        private static readonly string[] Summaries = new[]
+        {
+            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+        };
+
+        private readonly ILogger<WeatherForecastController> _logger;
+
+        public WeatherForecastController(ILogger<WeatherForecastController> logger)
+        {
+            _logger = logger;
+        }
+
+        [HttpGet(Name = "GetWeatherForecast")]
+        public IEnumerable<WeatherForecast> Get()
+        {
+            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
+            {
+                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+                TemperatureC = Random.Shared.Next(-20, 55),
+                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
+            })
+            .ToArray();
+        }
+    }
+}

+ 14 - 0
src/Electric/Electric.WebAPI/Electric.WebAPI.csproj

@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <InvariantGlobalization>true</InvariantGlobalization>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
+  </ItemGroup>
+
+</Project>

+ 6 - 0
src/Electric/Electric.WebAPI/Electric.WebAPI.http

@@ -0,0 +1,6 @@
+@Electric.WebAPI_HostAddress = http://localhost:5032
+
+GET {{Electric.WebAPI_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###

+ 25 - 0
src/Electric/Electric.WebAPI/Program.cs

@@ -0,0 +1,25 @@
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+    app.UseSwagger();
+    app.UseSwaggerUI();
+}
+
+app.UseHttpsRedirection();
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();

+ 41 - 0
src/Electric/Electric.WebAPI/Properties/launchSettings.json

@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:43163",
+      "sslPort": 44346
+    }
+  },
+  "profiles": {
+    "http": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "launchUrl": "swagger",
+      "applicationUrl": "http://localhost:5032",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "https": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "launchUrl": "swagger",
+      "applicationUrl": "https://localhost:7019;http://localhost:5032",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "launchUrl": "swagger",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}

+ 13 - 0
src/Electric/Electric.WebAPI/WeatherForecast.cs

@@ -0,0 +1,13 @@
+namespace Electric.WebAPI
+{
+    public class WeatherForecast
+    {
+        public DateOnly Date { get; set; }
+
+        public int TemperatureC { get; set; }
+
+        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+
+        public string? Summary { get; set; }
+    }
+}

+ 8 - 0
src/Electric/Electric.WebAPI/appsettings.Development.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}

+ 9 - 0
src/Electric/Electric.WebAPI/appsettings.json

@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}

+ 61 - 0
src/Electric/Electric.sln

@@ -0,0 +1,61 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34330.188
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.Domain", "Electric.Domain\Electric.Domain.csproj", "{F3EE1598-67A3-42FE-A056-D88BC03446B3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.Domain.Shared", "Electric.Domain.Shared\Electric.Domain.Shared.csproj", "{70C85D08-0D56-4687-80DD-B3860FB6CF6E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.Application.Contracts", "Electric.Application.Contracts\Electric.Application.Contracts.csproj", "{8E0CE4D6-9DD0-4B7B-B3BC-866C883D821D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.Application", "Electric.Application\Electric.Application.csproj", "{E3F0FE90-6494-4263-9380-410F03181C04}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.WebAPI", "Electric.WebAPI\Electric.WebAPI.csproj", "{E8E458B9-B12D-4000-8893-66EDE5DDAF58}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.EntityFrameworkCore", "Electric.EntityFrameworkCore\Electric.EntityFrameworkCore.csproj", "{A11207A5-ACAF-4BE0-8902-1F7FD09A7F77}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Electric.EntityFrameworkCore.DbMigrations", "Electric.EntityFrameworkCore.DbMigrations\Electric.EntityFrameworkCore.DbMigrations.csproj", "{B2B5DA79-604D-4F23-B074-2DB35B3A6B1F}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F3EE1598-67A3-42FE-A056-D88BC03446B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F3EE1598-67A3-42FE-A056-D88BC03446B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F3EE1598-67A3-42FE-A056-D88BC03446B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F3EE1598-67A3-42FE-A056-D88BC03446B3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{70C85D08-0D56-4687-80DD-B3860FB6CF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{70C85D08-0D56-4687-80DD-B3860FB6CF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{70C85D08-0D56-4687-80DD-B3860FB6CF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{70C85D08-0D56-4687-80DD-B3860FB6CF6E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8E0CE4D6-9DD0-4B7B-B3BC-866C883D821D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8E0CE4D6-9DD0-4B7B-B3BC-866C883D821D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8E0CE4D6-9DD0-4B7B-B3BC-866C883D821D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8E0CE4D6-9DD0-4B7B-B3BC-866C883D821D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E3F0FE90-6494-4263-9380-410F03181C04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E3F0FE90-6494-4263-9380-410F03181C04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E3F0FE90-6494-4263-9380-410F03181C04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E3F0FE90-6494-4263-9380-410F03181C04}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E8E458B9-B12D-4000-8893-66EDE5DDAF58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8E458B9-B12D-4000-8893-66EDE5DDAF58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E8E458B9-B12D-4000-8893-66EDE5DDAF58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E8E458B9-B12D-4000-8893-66EDE5DDAF58}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A11207A5-ACAF-4BE0-8902-1F7FD09A7F77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A11207A5-ACAF-4BE0-8902-1F7FD09A7F77}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A11207A5-ACAF-4BE0-8902-1F7FD09A7F77}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A11207A5-ACAF-4BE0-8902-1F7FD09A7F77}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B2B5DA79-604D-4F23-B074-2DB35B3A6B1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B2B5DA79-604D-4F23-B074-2DB35B3A6B1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B2B5DA79-604D-4F23-B074-2DB35B3A6B1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B2B5DA79-604D-4F23-B074-2DB35B3A6B1F}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {19B28926-0763-4F6D-84B2-D3CFADCF5AC3}
+	EndGlobalSection
+EndGlobal