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



我很抱歉这个标题,但我不知道用简短的描述来表达这一点的更好方法。

基本上,我的想法,我不确定它是否可能或是否有更好的方法,如下:

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

所以我在考虑这样做:

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的身份成员系统

我不确定的部分是这是否会成功。 如果它有效,如何在数据库端解释它? 如果没有,你们能指出为什么这是一个坏主意以及如何正确完成吗?

谢谢!

我知道你需要在员工/用户和项目/公司之间建立关系。您可以在它们之间建立一对多的关系。

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

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

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

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

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

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

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

最新更新