首先在asp.net代码中以多种方式连接两个上下文模型

时间:2018-10-11 03:29:59

标签: asp.net-mvc entity-framework ef-code-first dbcontext

我很抱歉标题,但我不知道有一种更好的简短描述方式。

基本上我在想什么,我不确定这是否可能或有更好的方法来解决这个问题,

我有一个属于公司模型的项目模型和一个应该以不同方式链接到项目的用户模型。

所以我正在考虑这样做:

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 :(得分:0)

据我了解,您需要在员工/用户与项目/公司之间建立联系。如果我没记错的话,您可以在他们之间建立一对多的联系。

在一个项目或公司中,可以有多名员工,一次员工只能在一家公司工作。

因此您可以按照以下方式设计实体

所以您的项目实体意味着它可以有多名员工

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; }
}

现在,实体框架将在它们之间建立一对多的关系。

注意:如果需要,您也可以建立多对多关系,这取决于您和您的期望功能。

答案 1 :(得分:0)

解决此问题的最佳选择是使用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");
           });
    }