使用静态表作为动态表的导航属性

时间:2017-01-04 20:14:22

标签: c# asp.net asp.net-mvc

好的,所以我在我的asp.net核心mvc应用程序中遇到了这个前所未有的场景。对于上下文,我的应用程序是用于纸牌游戏的甲板构建/共享网站(类似于hearthpwn或icyveins)。我有一张桌子“卡片”,在新牌发布到游戏之前一直保持不变。我还有一个表“Deck”,它将存储用户套牌并需要与Card表的关系。我正在从asp.net网站教程学习mvc,并希望继续沿着使用entityframeworkcore进行所有数据库交互的路径。所以,我的Deck课程看起来像这样:

public class Deck
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Class { get; set; }
    public virtual ICollection<DeckCard> DeckCards { get; set; }
}

我希望卡片成为Deck的导航属性。我不知道如何使用教程中提供的方法来完成这项工作。

数字1:使用dbinitializer并将测试数据播种到数据库在使用静态表时没有任何意义。每个Card行都需要一个DeckID属性,这是不实际的,因为显然每张卡片将被用于多个卡片组,或者至少大部分卡片都会使用。从逻辑上讲,这种方法需要一个动态的Card表,每次卡片在牌组中使用时我都会创建一个新的现有Card行。显然这不是正确的解决方案。我可以通过在甲板模型上使用字符串属性并附加cardID并以某种方式做一些魔法来使其工作,但那是邋and而不是关系。我需要能够查询Deck模型的导航属性..

任何见解或提示都将不胜感激。如果这个问题很复杂,我很抱歉,但我几乎不知道应该根据我的经验提出什么问题;我是关系数据库和asp.net框架的新手。提前谢谢!

编辑:编写用于连接表的新数据模型类(DeckCard)

public class DeckCard()
{
    public int ID {get; set;}
    public int DeckID {get; set;}
    public int CardID {get; set;}
}

2 个答案:

答案 0 :(得分:3)

您正在寻找的是中间表。您有Deck表,Card表和CardInDeck表。 Deck表有DeckID,Card表有CardID,CardInDeck表有CardID和DeckID。

这样,您就可以将多张卡片连接到卡座上。

其他人必须解释如何使用EF来做到这一点,但就表设计而言,这就是你想要的。

答案 1 :(得分:2)

最简单的实现是拥有一个查找表。每个Deck都有一个DeckCards集合,它有一个DeckId和一个CardId。因此,不同的用户组可以指向相同的卡,并且您不需要每个卡的新卡,只是查找说这个卡也可以访问该卡。