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

时间:2016-02-10 16:50:04

标签: c# asp.net-mvc entity-framework asp.net-identity code-migration

我将在ApplicationUser和一个名为Topic的自有类之间创建一个多对多关系的表。表I用于保持用户对主题的上下投票,使得用户不能多次投票给主题。所以我的想法是使用如下表所示的表(⚿是表的主键):

╔══════════════════════╦════════════════════╦═════════╦════════════════════════╗
║       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类以及扩展到该类的其他类。类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();
}

1 个答案:

答案 0 :(得分:0)

我找到了办法:

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    

图例:

  • ⚿是主键
  • ↗是forgain keys