[DB] DbContext relations

This commit is contained in:
max 2025-02-02 23:33:00 +01:00
parent 0f6b2fec88
commit 2938e1311f
10 changed files with 71 additions and 22 deletions

View File

@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore;
namespace DotBased.AspNet.Authority.EFCore;
public class AuthorityContext : DbContext
public class AuthorityContext(DbContextOptions<AuthorityContext> options) : DbContext(options)
{
public DbSet<AuthorityAttribute> Attributes { get; set; }
public DbSet<AuthorityGroup> Groups { get; set; }
@ -12,10 +12,32 @@ public class AuthorityContext : DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AuthorityAttribute>().ToTable("authority_attributes");
modelBuilder.Entity<AuthorityGroup>().ToTable("authority_groups");
modelBuilder.Entity<AuthorityRole>().ToTable("authority_roles");
modelBuilder.Entity<AuthorityUser>().ToTable("authority_users");
modelBuilder.Entity<AuthorityAttribute>(attributeEntity =>
{
attributeEntity.ToTable("authority_attributes");
attributeEntity.HasKey(a => new { a.BoundId, a.AttributeKey });
});
modelBuilder.Entity<AuthorityGroup>(groupEntity =>
{
groupEntity.ToTable("authority_groups");
groupEntity.HasKey(x => x.Id);
groupEntity.HasMany(g => g.Attributes).WithOne().HasForeignKey(a => a.BoundId).OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity<AuthorityRole>(roleEntity =>
{
roleEntity.ToTable("authority_roles");
roleEntity.HasKey(x => x.Id);
});
modelBuilder.Entity<AuthorityUser>(userEntity =>
{
userEntity.ToTable("authority_users");
userEntity.HasKey(x => x.Id);
userEntity.HasMany(u => u.Attributes).WithOne().HasForeignKey(a => a.BoundId).OnDelete(DeleteBehavior.Cascade);
});
base.OnModelCreating(modelBuilder);
}
}

View File

@ -12,6 +12,10 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.12" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.12" />
</ItemGroup>

View File

@ -0,0 +1,23 @@
# EF Core database
## Add migration project
```csharp
options.UseSqlite("Data Source=dev-dotbased.db", c => c.MigrationsAssembly("PROJECT-NAME"));
```
## EF Tool
Add migration
```shell
dotnet ef migrations add MIGRATION-NAME --project PROJECT-NAME
```
Remove migrations
```shell
dotnet ef migrations remove --project PROJECT-NAME
```
Update database
```shell
dotnet ef database update --project PROJECT-NAME
```

View File

@ -17,6 +17,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Models\Data\" />
<Folder Include="Models\Security\" />
</ItemGroup>

View File

@ -1,26 +1,18 @@
namespace DotBased.AspNet.Authority.Models.Authority;
public class AuthorityAttribute
public class AuthorityAttribute(string attributeKey, Guid bound)
{
public AuthorityAttribute(string attributeKey, string bound)
public AuthorityAttribute() : this(string.Empty, Guid.NewGuid())
{
AttributeKey = attributeKey;
BoundId = bound;
}
public AuthorityAttribute()
{
AttributeKey = string.Empty;
BoundId = string.Empty;
}
public string AttributeKey { get; set; } // ClaimType/Authority.attribute.enabled
public Guid BoundId { get; set; } = bound;
public string BoundId { get; set; } // Bound to User, Group, Role id
public string AttributeKey { get; set; } = attributeKey;
public object? AttributeValue { get; set; }
public string AttributeValue { get; set; } = string.Empty;
public string? Type { get; set; } // AspNet.Claim.Role/Property/Data.JSON, Data.Raw, Data.Base64 etc.
public string? Type { get; set; }
public long Version { get; set; }
}

View File

@ -20,4 +20,5 @@ public class AuthorityGroup
public long Version { get; set; }
public DateTime CreatedDate { get; set; }
public ICollection<AuthorityAttribute> Attributes { get; set; } = [];
}

View File

@ -1,6 +1,6 @@
namespace DotBased.AspNet.Authority.Models.Authority;
public abstract class AuthorityRole()
public class AuthorityRole()
{
public AuthorityRole(string name) : this()
{

View File

@ -41,5 +41,7 @@ public class AuthorityUser()
public bool PhoneNumberConfirmed { get; set; }
public ICollection<AuthorityAttribute> Attributes { get; set; } = [];
public override string ToString() => UserName ?? EmailAddress ?? string.Empty;
}

View File

@ -23,7 +23,7 @@ builder.Logging.ClearProviders();
builder.Logging.AddDotBasedLoggerProvider(LogService.Options);
builder.Services.AddAuthorityContext(options =>
{
options.UseSqlite("Data Source=dev-dotbased.db");
options.UseSqlite("Data Source=dev-dotbased.db", c => c.MigrationsAssembly("TestWebApi"));
});
builder.Services.AddAuthority(options =>
{

View File

@ -8,7 +8,11 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.8"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.12" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/>
</ItemGroup>