Working in migration to linq2SQL

This commit is contained in:
2020-09-28 21:23:11 +02:00
parent 552e9cc6df
commit 9bf37f5799
17 changed files with 194 additions and 876 deletions

View File

@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Linq;
using LinqToDB.Configuration;
namespace DataModels
{
public class ConnectionStringSettings : IConnectionStringSettings
{
public string ConnectionString { get; set; }
public string Name { get; set; }
public string ProviderName { get; set; }
public bool IsGlobal => false;
}
public class MySettings : ILinqToDBSettings
{
public IEnumerable<IDataProviderSettings> DataProviders => Enumerable.Empty<IDataProviderSettings>();
public string DefaultConfiguration => "MySqlServer";
public string DefaultDataProvider => "MySqlServer";
public IEnumerable<IConnectionStringSettings> ConnectionStrings
{
get
{
yield return
new ConnectionStringSettings
{
Name = "Northwind",
ProviderName = "MySqlServer",
ConnectionString = @"Server=srvbo;Database=UserService;Uid=UserDbAdmin;Pwd=12345678;"
};
}
}
}
}

View File

@ -1,78 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using UserService.Infrastructure.DataModels;
namespace UserService.DatabaseLayer.DataModels
{
public static class ModelBuilderExtensions
{
public static void Seed(this ModelBuilder modelBuilder)
{
if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder));
var groups = new OrganizationUnit { CommonName = "Groups", Id = Guid.NewGuid() };
var users = new OrganizationUnit { CommonName = "Users", Id = Guid.NewGuid() };
var germany = new OrganizationUnit { CommonName = "Germany", Id = Guid.NewGuid(), ParentId = users.Id };
var usa = new OrganizationUnit { CommonName = "USA", Id = Guid.NewGuid(), ParentId = users.Id };
var arizona = new OrganizationUnit { CommonName = "Arizona", Id = Guid.NewGuid(), ParentId = usa.Id };
var france = new OrganizationUnit { CommonName = "France", Id = Guid.NewGuid(), ParentId = users.Id };
modelBuilder.Entity<OrganizationUnit>().HasData(users, groups, germany, usa, arizona, france);
var user = new User { CommonName = Environment.UserName, IsActive = true, Id = Guid.NewGuid(), ParentId = users.Id };
modelBuilder.Entity<User>().HasData(user);
var secGroup = new SecurityGroup { CommonName = "Global Admin", Id = Guid.NewGuid(), ParentId = groups.Id };
modelBuilder.Entity<SecurityGroup>().HasData(secGroup);
modelBuilder.Entity<MembersMember>()
.HasData(new MembersMember { MemberId = secGroup.Id, AttachedMemberId = user.Id });
}
public static void CreateRelations(this ModelBuilder modelBuilder)
{
if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder));
modelBuilder.Entity<MembersMember>()
.HasKey(bc => new { bc.MemberId, bc.AttachedMemberId });
modelBuilder.Entity<MembersMember>()
.HasOne(bc => bc.AttachedMember)
.WithMany(b => b!.MemberOf)
.HasForeignKey(bc => bc.AttachedMemberId);
modelBuilder.Entity<MembersMember>()
.HasOne(bc => bc.Member)
.WithMany(c => c!.Members)
.HasForeignKey(bc => bc.MemberId);
modelBuilder.Entity<Node>()
.HasMany(c => c.Children)
.WithOne(e => e.Parent!)
.HasForeignKey(bc => bc.ParentId);
}
}
public static class UserExtensions
{
public static IEnumerable<SecurityGroup> GetSecurityGroups(this User user)
{
if (user == null) throw new ArgumentNullException(nameof(user));
foreach (var userMember in user.MemberOf)
{
if (userMember.Member is SecurityGroup securityGroup)
{
yield return securityGroup;
}
}
}
}
public static class SecurityGroupExtensions
{
public static IEnumerable<Member> GetAttachedMembers(this SecurityGroup securityGroup)
{
if (securityGroup == null) throw new ArgumentNullException(nameof(securityGroup));
foreach (var userMember in securityGroup.Members)
{
if (userMember.AttachedMember is null) continue;
yield return userMember.AttachedMember;
}
}
}
}

View File

@ -6,6 +6,7 @@
//---------------------------------------------------------------------------------------------------
#pragma warning disable 1591
#nullable enable
using System;
using System.Collections.Generic;
@ -17,11 +18,11 @@ using LinqToDB.Mapping;
namespace DataModels
{
/// <summary>
/// Database : UserDatabase
/// Database : UserService
/// Data Source : srvbo
/// Server Version : 5.5.5-10.3.22-MariaDB-1ubuntu1
/// </summary>
public partial class UserDatabaseDB : LinqToDB.Data.DataConnection
public partial class UserServiceDB : LinqToDB.Data.DataConnection
{
public ITable<Member> Members { get { return this.GetTable<Member>(); } }
public ITable<MembersMember> MembersMembers { get { return this.GetTable<MembersMember>(); } }
@ -30,13 +31,13 @@ namespace DataModels
public ITable<SecurityGroup> SecurityGroups { get { return this.GetTable<SecurityGroup>(); } }
public ITable<User> Users { get { return this.GetTable<User>(); } }
public UserDatabaseDB()
public UserServiceDB()
{
InitDataContext();
InitMappingSchema();
}
public UserDatabaseDB(string configuration)
public UserServiceDB(string configuration)
: base(configuration)
{
InitDataContext();
@ -58,31 +59,31 @@ namespace DataModels
/// MembersMember_ibfk_2_BackReference
/// </summary>
[Association(ThisKey="Id", OtherKey="AttachedMemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
public IEnumerable<MembersMember> MembersMemberIbfk2BackReferences { get; set; }
public IEnumerable<MembersMember> MembersMemberIbfk2BackReferences { get; set; } = null!;
/// <summary>
/// MembersMember_ibfk_1_BackReference
/// </summary>
[Association(ThisKey="Id", OtherKey="MemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
public IEnumerable<MembersMember> MembersMemberibfks { get; set; }
public IEnumerable<MembersMember> MembersMemberibfks { get; set; } = null!;
/// <summary>
/// Members_ibfk_1
/// Members_ibfk_2
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Members_ibfk_1", BackReferenceName="Membersibfks")]
public Node Node { get; set; }
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Members_ibfk_2", BackReferenceName="Membersibfks")]
public Node Node { get; set; } = null!;
/// <summary>
/// SecurityGroups_ibfk_1_BackReference
/// SecurityGroups_ibfk_2_BackReference
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
public IEnumerable<SecurityGroup> SecurityGroupsibfks { get; set; }
public IEnumerable<SecurityGroup> SecurityGroupsibfks { get; set; } = null!;
/// <summary>
/// Users_ibfk_1_BackReference
/// Users_ibfk_2_BackReference
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
public IEnumerable<User> Usersibfks { get; set; }
public IEnumerable<User> Usersibfks { get; set; } = null!;
#endregion
}
@ -99,13 +100,13 @@ namespace DataModels
/// MembersMember_ibfk_2
/// </summary>
[Association(ThisKey="AttachedMemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="MembersMember_ibfk_2", BackReferenceName="MembersMemberIbfk2BackReferences")]
public Member AttachedMember { get; set; }
public Member AttachedMember { get; set; } = null!;
/// <summary>
/// MembersMember_ibfk_1
/// </summary>
[Association(ThisKey="MemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="MembersMember_ibfk_1", BackReferenceName="MembersMemberibfks")]
public Member Member { get; set; }
public Member Member { get; set; } = null!;
#endregion
}
@ -113,21 +114,22 @@ namespace DataModels
[Table("Nodes")]
public partial class Node
{
[PrimaryKey, Identity] public int Id { get; set; } // int(11)
[PrimaryKey, Identity] public int Id { get; set; } // int(11)
[Column, NotNull ] public string CommonName { get; set; } = null!; // text
#region Associations
/// <summary>
/// Members_ibfk_1_BackReference
/// Members_ibfk_2_BackReference
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
public IEnumerable<Member> Membersibfks { get; set; }
public IEnumerable<Member> Membersibfks { get; set; } = null!;
/// <summary>
/// OrganizationUnits_ibfk_1_BackReference
/// OrganizationUnits_ibfk_2_BackReference
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
public IEnumerable<OrganizationUnit> OrganizationUnitsibfks { get; set; }
public IEnumerable<OrganizationUnit> OrganizationUnitsibfks { get; set; } = null!;
#endregion
}
@ -142,10 +144,10 @@ namespace DataModels
#region Associations
/// <summary>
/// OrganizationUnits_ibfk_1
/// OrganizationUnits_ibfk_2
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="OrganizationUnits_ibfk_1", BackReferenceName="OrganizationUnitsibfks")]
public Node Node { get; set; }
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="OrganizationUnits_ibfk_2", BackReferenceName="OrganizationUnitsibfks")]
public Node Node { get; set; } = null!;
#endregion
}
@ -158,10 +160,10 @@ namespace DataModels
#region Associations
/// <summary>
/// SecurityGroups_ibfk_1
/// SecurityGroups_ibfk_2
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="SecurityGroups_ibfk_1", BackReferenceName="SecurityGroupsibfks")]
public Member Member { get; set; }
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="SecurityGroups_ibfk_2", BackReferenceName="SecurityGroupsibfks")]
public Member Member { get; set; } = null!;
#endregion
}
@ -169,18 +171,18 @@ namespace DataModels
[Table("Users")]
public partial class User
{
[Column, NotNull ] public int Id { get; set; } // int(11)
[Column, Nullable] public string FirstName { get; set; } // text
[Column, Nullable] public string LastName { get; set; } // text
[Column, NotNull ] public bool IsActive { get; set; } // bit(1)
[Column, NotNull ] public int Id { get; set; } // int(11)
[Column, Nullable] public string? FirstName { get; set; } // text
[Column, Nullable] public string? LastName { get; set; } // text
[Column, NotNull ] public bool IsActive { get; set; } // bit(1)
#region Associations
/// <summary>
/// Users_ibfk_1
/// Users_ibfk_2
/// </summary>
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Users_ibfk_1", BackReferenceName="Usersibfks")]
public Member Member { get; set; }
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Users_ibfk_2", BackReferenceName="Usersibfks")]
public Member Member { get; set; } = null!;
#endregion
}

View File

@ -5,50 +5,15 @@
<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.MySql.Tools.ttinclude" #>
<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
<#
/*
1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
and copy content from this file to it. For example:
MyProject
DataModels
MyDatabase.tt
2. Modify the connection settings below to connect to your database.
3. Add connection string to the web/app.config file:
<connectionStrings>
<add name="MyDatabase" connectionString="Server=MyServer;Port=3306;Database=MyDatabase;Uid=root;Pwd=TestPassword;charset=utf8;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
4. To access your database use the following code:
using (var db = new MyDatabaseDB())
{
var q =
from c in db.Customers
select c;
foreach (var c in q)
Console.WriteLine(c.ContactName);
}
5. See more at https://linq2db.github.io/articles/T4.html
IMPORTANT: if running .tt file gives you error like this:
"error : Failed to resolve include text for file: C:\...\$(LinqToDBT4<SOME_DB>TemplatesDirectory)LinqToDB.<DB_NAME>.Tools.ttinclude"
check tt file properties.
Custom tool must be set to TextTemplatingFileGenerator, not TextTemplatingFilePreprocessor or any other value.
*/
NamespaceName = "DataModels";
// to configure GetSchemaOptions properties, add them here, before load metadata call
LoadMySqlMetadata("srvbo", "UserDatabase", "UserDbAdmin", "12345678");
// LoadMySqlMetadata(string connectionString);
LoadMySqlMetadata("srvbo", "UserService", "UserDbAdmin", "12345678");
// LoadMySqlMetadata(string connectionString);
// to adjust loaded database model before generation, add your code here, after load metadata, but before GenerateModel() call
EnableNullableReferenceTypes = true;
GenerateModel();
#>

View File

@ -1,23 +0,0 @@
using Microsoft.EntityFrameworkCore;
using UserService.Infrastructure.DataModels;
namespace UserService.DatabaseLayer.DataModels
{
public class UserServiceDbContext : DbContext
{
public DbSet<User> Users { get; set; } = null!;
public DbSet<SecurityGroup> SecurityGroups { get; set; } = null!;
public DbSet<MembersMember> UserMembers { get; set; } = null!;
public DbSet<OrganizationUnit> OrganizationUnits { get; set; } = null!;
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite(@"Data Source=C:\Users\holger\Desktop\UserService\UserService.db");
/// <inheritdoc />
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.CreateRelations();
modelBuilder.Seed();
}
}
}