EF: 6.0代码优先 .NET: 4.5.2 VS2015
我需要2个用户在Board
的情况。可以有很多电路板,因此Tom可以是电路板上的Grantor
而玛丽是Claimer
。然而在另一个板上,玛丽可能是Grantor
而汤姆可能是Claimer
。
为了解决同一模型中有2个ApplicationUser,我从ApplicationUser
派生出来:
[Table("GrantorUsers")]
public class Grantor : ApplicationUser
{
public Grantor()
{
GrantBoards = new List<Board>();
}
public ICollection<Board> GrantBoards { get; set; }
}
[Table("ClaimerUsers")]
public class Claimer : ApplicationUser
{
public Claimer()
{
ClaimBoards = new List<Board>();
}
public ICollection<Board> ClaimBoards { get; set; }
}
然后创建了Board类:
public class Board
{
public Board()
{
TaskItems = new List<TaskItem>();
BoardSharedUsers = new HashSet<ApplicationUser>();
}
public int Id { get; set; }
public string Name { get; set; }
public string ClaimerId { get; set; }
[ForeignKey("ClaimerId")]
public Claimer Claimer { get; set; }
public string GrantorId { get; set; }
[ForeignKey("GrantorId")]
public Grantor Grantor { get; set; }
public int TotalPoints { get; set; }
public ICollection<TaskItem> TaskItems { get; set; }
public ICollection<ApplicationUser> BoardSharedUsers { get; set; }
}
并添加了DbSet:
public IDbSet<Board> Boards { get; set; }
这为只有ID字段的GrantorUsers和ClaimerUsers的数据库添加了2个表。
这是设计此架构的错误方法吗?或者如果它是正确的,汤姆怎么可能一直是一个ApplicationUser,但是当我创建一个董事会让他成为授予者或者是Claimer?
var tom = db.Users.Find(id);
var board = new Board {
GrantorId = tom.Id,
//...initialize other properties
};
var grantor = new Grantor(tom); //add a copy constructor
//and how tough to copy all the
//inherited properties from
//ApplicationUser's parent base classes
context.Users.Attach(grantor);
context.Boards.Add(board);
context.SaveChanges();
这是我之后的想法,但知道必须以不同的方式完成。在下一局,Tom可能是Claimer和Mary a Claimer。
答案 0 :(得分:0)
我认为这不是c#问题,但无论如何。 您需要使用角色,用户组。 “快速通道”示例: 在数据库存储表“Roles”中使用struct | UserId | BoardId | Role |。 当“Tom”访问某个板时,您的程序会检查此表并指定适当的角色。所以他可以为不同的董事会担任不同的角色。