实体框架ApplicationUser在一个类中不止一次

时间:2017-01-27 03:38:12

标签: c# .net entity-framework ef-code-first entity-framework-6

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。

1 个答案:

答案 0 :(得分:0)

我认为这不是c#问题,但无论如何。 您需要使用角色,用户组。 “快速通道”示例: 在数据库存储表“Roles”中使用struct | UserId | BoardId | Role |。 当“Tom”访问某个板时,您的程序会检查此表并指定适当的角色。所以他可以为不同的董事会担任不同的角色。