具有多对多关系和额外列的 table 的代码迁移

Code migration for table with many to many relation and extra columns

我将创建一个 table,在 ApplicationUser 和自己创建的 class 之间建立多对多关系,名为 Topic。 table 我将用于保存用户对某个主题的赞成票和反对票,这样用户就不能对一个主题进行多次投票。所以我的想法是使用如下所示的 table(⚿ 是 table 的主键):

╔══════════════════════╦════════════════════╦═════════╦════════════════════════╗
║       UserId ⚿      ║      TopicId ⚿    ║   Vote  ║          Time          ║
╠══════════════════════╬════════════════════╬═════════╬════════════════════════╣
║ x                    ║ 1                  ║ up      ║ 2016/02/02 15:00:00    ║
║ y                    ║ 2                  ║ up      ║ 2016/02/01 15:00:00    ║
║ y                    ║ 1                  ║ down    ║ 2016/01/01 14:00:00    ║
╚══════════════════════╩════════════════════╩═════════╩════════════════════════╝
            ↓                     ↓              ↓                 ↓           
    Must reference to     Must reference to   Other information about the vote 
  the table where the    the table where my                                   
    users are stored      topic are stored  

如何将此结构迁移到具有身份框架的数据库?我也使用代码优先的工作方式。

您可以在下面找到我的 Topic class 和扩展到那个 class 的其他 classes。 class ApplictionUser中的代码不变。

public class Topic
{
    public int TopicId { get; set; }
    public bool Deleted { get; set; }
    public string UserId { get; set; }
    public ApplicationUser User{ get; set; }
    public string Text { get; set; }
    public DateTime Creation { get; set; }
    public List<Vlag> Flags { get; set; }
    public int? BlogId { get; set; }
    public Blog Blog { get; set; }
    public int? ReactionId { get; set; }
    public Reaction Reaction { get; set; }
}

public class Blog: Topic, IVote
{
    public int Id { get; set; }
    public int CategorieId { get; set; }
    public Categorie Categorie { get; set; }
    public string Name { get; set; }
    public int Down { get; set; } 
    public int Up { get; set; }  

    public int CalculateTotal()
    {
        return Up - Down;
    }
}

public class Reactie : Topic, IVote
{
    public int Id { get; set; }
    public int Down { get; set; }
    public int Up{ get; set; }
    public Blog OwnerBlog { get; set; }
    public int OwnerBlogId { get; set; }

    public int CalculateTotal()
    {
        return Up - Down;
    }
}

public interface IVote // used for holding the number of up and down votes for a blog 
                       // or reaction.
{
    int Up { get; set; }
    int Down { get; set; }

    int CalculateTotal();
}

我找到了一种方法:

Table name: Votes
╔═════════════════╦══════════════════════╦════════════════════╦═════════╦════════════════════════╗
║     VoteId ⚿   ║       UserId ↗       ║      TopicId ↗     ║   Vote  ║          Time          ║
╠═════════════════╬══════════════════════╬════════════════════╬═════════╬════════════════════════╣
║ 1               ║ x                    ║ 1                  ║ up      ║ 2016/02/02 15:00:00    ║
╠═════════════════╬══════════════════════╬════════════════════╬═════════╬════════════════════════╣
║ 2               ║ y                    ║ 2                  ║ up      ║ 2016/02/01 15:00:00    ║
╠═════════════════╬══════════════════════╬════════════════════╬═════════╬════════════════════════╣
║ 3               ║ y                    ║ 1                  ║ down    ║ 2016/01/01 14:00:00    ║
╚═════════════════╩══════════════════════╩════════════════════╩═════════╩════════════════════════╝
         ↓                    ↓                     ↓              ↓                 ↓           
  New primary key       References to         References to     Other information about the vote  
    of the table    the table where the    the table where my                                     
                      users are stored      topic are stored    

图例:

  • ⚿ 是主键
  • ↗ 是放弃键