Соединение двух контекстных моделей несколькими способами в коде asp.net - PullRequest
0 голосов
/ 11 октября 2018

Прошу прощения за заголовок, но я не знал лучшего способа выразить это в коротком описании.

В основном то, что я думаю, в котором я даже не уверен, возможно ли этоили, если есть лучший способ, следующий:

У меня есть модель проекта, которая принадлежит модели компании, и модель пользователя, которая должна быть связана с проектом различными способами.

Итак, я думал о том, чтобы сделать это:

public class Project
{
    [Key]
    [Required]
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    public string Description { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public DateTime StartDate { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? EndDate { get; set; }

    public virtual List<User> Clients { get; set; }

    public virtual List<User> Employees { get; set; }

    public virtual User Manager { get; set; }

    public virtual List<User> ProjectLeaders { get; set; }

    public virtual Company Company { get; set; }
}

Таким образом, в проекте должны быть сотрудники, менеджер, руководители проектов и клиенты, и все они различаются в зависимости от проекта, и все они являются пользователями всистема.

Я также хотел бы отметить, что я использую систему членства в удостоверениях asp.net

Часть, в которой я не уверен, это то, что это сработает.Если это будет работать, как это интерпретируется на стороне базы данных?Если нет, не могли бы вы, ребята, указать, почему это плохая идея и как это можно сделать правильно?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Лучшим вариантом решения проблемы было использование FluentAPI для правильного подключения моделей.

Вот как должны выглядеть модели после исправления:

public class Project
{
    [Key]
    [Required]
    public string Id{ get; set; }

    [Required]
    public string Name { get; set; }

    public string Description { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public DateTime StartDate { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? EndDate { get; set; }

    public virtual ICollection<User> Clients { get; set; }

    public virtual ICollection<User> Employees { get; set; }

    public virtual ICollection<User> ProjectLeaders { get; set; }

    public virtual User ProjectManager { get; set; }

}

public class User : IdentityUser
{
    public string Name { get; set; }

    public virtual List<Project> ProjectsAsClient { get; set; }

    public virtual List<Project> ProjectsAsEmployee { get; set; }

    public virtual List<Project> ProjectsAsProjectLeader { get; set; }

    public virtual Project ProjectAsManager { get; set; }
}

и в контексте:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>()
            .HasMany(u => u.ProjectsAsClient)
            .WithMany(t => t.Clients)
            .Map(x => 
            {
                x.MapLeftKey("UserId");
                x.MapRightKey("ProjectId");
                x.ToTable("ProjectClients");
            });

        modelBuilder.Entity<User>()
           .HasMany(u => u.ProjectsAsEmployee)
           .WithMany(t => t.Employees)
           .Map(x =>
           {
               x.MapLeftKey("UserId");
               x.MapRightKey("ProjectId");
               x.ToTable("ProjectEmployees");
           });

        modelBuilder.Entity<User>()
           .HasMany(u => u.ProjectsAsProjectLeader)
           .WithMany(t => t.ProjectLeaders)
           .Map(x =>
           {
               x.MapLeftKey("UserId");
               x.MapRightKey("ProjectId");
               x.ToTable("ProjectLeaders");
           });
    }
0 голосов
/ 11 октября 2018

Насколько я понимаю, вам нужна связь между Сотрудником / пользователем и проектом / Компанией. Если я не ошибаюсь. Вы можете установить связь между ними.

В проекте или в компании можноиметь несколько сотрудников, и в то же время сотрудник может работать только в компании.

Таким образом, вы можете спроектировать свои объекты следующим образом

Таким образом, объект вашего проекта означает, что в нем может быть несколько сотрудников

public class Project
{
  [Key]
  [Required]
  public Guid Id { get; set; }

  [Required]
  public string Name { get; set; }

  public string Description { get; set; }

  [Required]
  [DataType(DataType.DateTime)]
  public DateTime StartDate { get; set; }

  [DataType(DataType.DateTime)]
  public DateTime? EndDate { get; set; }

  public virtual List<User> Employees { get; set; }
}

И здесь ваша сущность пользователя означает, что пользователь может работать на компанию одновременно.

public class User
{
  [Key]
  [Required]
  public Guid Id { get; set; }

  [Required]
  public string Name { get; set; }

  public string Description { get; set; }

  .................................
  .................................

   //ProjectId  will be your foreign key
   public int ProjectId { get; set; }

   public virtual Project Project { get; set; }
}

Теперь инфраструктура сущности сделаетотношение один ко многим между ними.

Примечание: и вы можете установить отношение многие ко многим также, если хотите. Это зависит от вас и ваших желаний.

...