Entity Framework Core – как улучшить дизайн приложения, известного как диспетчер идентификации [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Entity Framework Core – как улучшить дизайн приложения, известного как диспетчер идентификации [закрыто]

Сообщение Anonymous »

У меня есть некоторые сомнения по поводу моего дизайна. Во-первых, позвольте мне объяснить дизайн моего приложения.
  • У вас есть идентификаторы, которые являются основным местом хранения всей информации о пользователе и его разрешениях.
  • Каждое удостоверение может иметь несколько приложений.
  • Каждое приложение может иметь несколько разрешений, специфичных для этого приложения.
  • Кроме того, каждое приложение может иметь несколько учетных записей, специфичных для этого приложения.
  • Кроме того, каждая учетная запись приложения может иметь несколько разрешений приложения.
Некоторая информация, которая может быть полезно: Моя конструкция следующая:

Код: Выделить всё

Identity.cs:
using System.ComponentModel.DataAnnotations;

namespace CodeFirst;

public class Identity
{
[Required]
public int IdentityID  { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }

public ICollection? ApplicationAccounts { get; set; }
}

Код: Выделить всё

Application.cs:
namespace CodeFirst;

public class Application
{
// properties
public int ApplicationID { get; set; }
public string? ApplicationName { get; set; }

// Navigation property to ApplicationPrivilege
public ICollection? ApplicationPrivileges { get; set; }
// Navigation property to ApplicationAccount
public ICollection? ApplicationAccounts { get; set; }

// Methods
}

Код: Выделить всё

ApplicationPrivilege.cs:
using System.ComponentModel.DataAnnotations;

namespace CodeFirst;

public class ApplicationPrivilege
{
// properties
[Required]
public int ApplicationPrivilegeID { get; set;}
public string? PrivilegeName { get; set;}
public int ApplicationID { get; set; }

// Navigation property to ApplicationAccount
public ICollection? ApplicationAccounts { get; set; }
public Application Application { set; get; } // Required reference navigation to principal
}

Код: Выделить всё

ApplicationAccount.cs:
using System.ComponentModel.DataAnnotations;

namespace CodeFirst;

public class ApplicationAccount
{
// properties
[Required]
public int ApplicationAccountID { get; set;}
public string? AccountName { get; set;}
public int ApplicationID { get; set; }
public int IdentityID { get; set; }

// Navigation property to ApplicationPrivilege
public ICollection? ApplicationPrivileges { get; set; }
// Navigation property to Identity
public Identity Identity { get; set; }
public Application Application { set; get; } // Required reference navigation to principal
}

Код: Выделить всё

Datacontext.cs:
using Microsoft.EntityFrameworkCore; // CbContext, DbSet

namespace CodeFirst;

public class IAM : DbContext
{
public DbSet? Identities { get; set; }
public DbSet? Applications { get; set;}
public DbSet? ApplicationPrivileges { get; set; }
public DbSet? ApplicationAccounts { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string path = Path.Combine(Environment.CurrentDirectory, "CodeFirst.db");

string connection = $"Filename={path}";

WriteLine($"Connection: {connection}");

optionsBuilder.UseSqlite(connection);
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Fluent API validation rules
modelBuilder.Entity().Property(i =>  i.PESEL).IsRequired();

// Populate database with sample data
Identity dgrzejek = new()
{
IdentityID = 1,
FirstName = "Test",
LastName = "One",
PESEL = "12345678900"
};
Identity jbankowy = new()
{
IdentityID = 2,
FirstName = "Test",
LastName = "Two",
PESEL = "12345678900"
};
Identity jtestowy = new()
{
IdentityID = 3,
FirstName = "Test",
LastName = "Three",
PESEL = "12345678900"
};

Application appOne = new()
{
ApplicationID = 1,
ApplicationName = "Application One"
};

Application appTwo = new()
{
ApplicationID = 2,
ApplicationName = "Application Two"
};

ApplicationAccount testOne_AppOne = new()
{
ApplicationAccountID = 1,
AccountName = "testOne_AppOne",
ApplicationID = 2,
IdentityID = 1
};

ApplicationAccount testTwo_AppOne = new()
{
ApplicationAccountID = 2,
AccountName = "testTwo_AppOne",
ApplicationID = 2,
IdentityID = 2
};

ApplicationAccount testThree_AppTwo = new()
{
ApplicationAccountID = 3,
AccountName = "testThree_AppTwo",
ApplicationID = 1,
IdentityID = 3
};

ApplicationPrivilege privOneAppOne = new()
{
ApplicationPrivilegeID = 1,
PrivilegeName = "privOneAppOne",
ApplicationID = 1
};

ApplicationPrivilege privTwoAppOne = new()
{
ApplicationPrivilegeID = 2,
PrivilegeName = "privTwoAppOne",
ApplicationID = 1
};

ApplicationPrivilege privThreeAppOne = new()
{
ApplicationPrivilegeID = 3,
PrivilegeName = "USR_PRE_AP",
ApplicationID = 1
};

ApplicationPrivilege privOneAppTwo = new()
{
ApplicationPrivilegeID = 4,
PrivilegeName = "asco",
ApplicationID = 2
};

modelBuilder.Entity().HasData(dgrzejek, jbankowy, jtestowy);
modelBuilder.Entity().HasData(appOne, appTwo);
modelBuilder.Entity().HasData(testOne_AppOne,testTwo_AppOne);
modelBuilder.Entity().HasData(privOneAppOne,privTwoAppOne,privThreeAppOne,privOneAppTwo);

modelBuilder.Entity()
.HasMany(i => i.ApplicationAccounts)
.WithOne(a => a.Identity)
.IsRequired();

modelBuilder.Entity()
.HasMany(p => p.ApplicationPrivileges)
.WithOne(p => p.Application)
.IsRequired();

modelBuilder.Entity()
.HasMany(p => p.ApplicationAccounts)
.WithOne(p => p.Application)
.IsRequired();

modelBuilder.Entity()
.HasMany(p => p.ApplicationPrivileges)
.WithMany(p => p.ApplicationAccounts)
.UsingEntity(e => e.HasData(
// testOne_AppOne have asco
new { ApplicationAccountsApplicationAccountID = 1, ApplicationPrivilegesApplicationPrivilegeID = 1 }
));
}
}
Я пробовал много способов создания отношений, например с помощью Identity. 

Код: Выделить всё

Application
 вместо 

Код: Выделить всё

ApplicationAccount
, но это не имеет особого смысла, поскольку если у вас есть учетная запись в приложении xyz, очевидно, что ваша личность по родству также имеет это приложение.
Текущий подход, который я показываю, действительно работает: я могу извлечь идентификационные данные их учетных записей, узнать, из какого приложения используется эта учетная запись, и разрешения этой учетной записи. Кроме того, я могу просто получить все разрешения для всех приложений. Это позволяет мне определить, какие разрешения конкретный пользователь приложения может получить в будущем.
Хотя это работает, это просто не кажется чистым. Я пробовал найти множество статей о том, как следует строить такую ​​структуру, но не смог сделать ее лучше, и я точно знаю, что мне следует это сделать.

Подробнее здесь: https://stackoverflow.com/questions/786 ... tity-manag
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»