使用对象ID与将对象填充到其他类之间的权衡是什么?

时间:2014-02-21 02:36:58

标签: c# entity-framework class properties

编辑:伟大的早期回复让我意识到,我的问题与权衡相比,更有用的是@ Leo的变化。

我正在开发Code-First EF中的数据模型,并且对可能非常基础的东西感到不熟悉。

鉴于Team和Player类,Team有N个玩家,可以设计数据模型

1)将玩家作为成员子对象:

class Team
{
    int Id;
    ICollection<Player> Players;
}

或 2)(被拒绝没有真正的好处)我们可以将参考ID传递给玩家

class Team
{
    int Id;
    ICollection<int> PlayerIds;
}

或 3) 使用外键ID实现模型独立性

class Team
{
    int Id;
}

class Player
{
    int Id;
    int TeamId;
}

我可以看到第3种方法有一些明显的好处,如下面@Leo所示。因此,或许我的问题最好是措辞,在这一点上,“在什么情况下,人们可能更倾向于使用变体1”?

4 个答案:

答案 0 :(得分:3)

嗯,我想你是对的,你找不到很多资源来概述你应该如何设计数据层和/或模型。实际上,您将找到的资源最有可能描绘出不同的方式,并可能建议您应该(或不应该)做什么。但是,我发现这个主题非常主观,你不应该把它与背景区分开来,我的意思是,只有你应该知道哪种方法最适合你的情况,因为你是最了解你的系统的人#39;内在函数。这两种方法对我来说都很好,你应该总是努力保持子系统之间的松散耦合。基本上,这个映射...

class Team
{
    int Id;
    ICollection<Player> Players;
}

让团队依赖于玩家,这是很好的IF(并且只有在它)是一个永远不会改变的要求。此外,如果玩家将永远属于一个且只有一个团队,那么您可以采取另一种方法,让您的团队模型/实体依赖免费...

class Team
{
    int Id;
    string TeamName;
}

class Player
{
    int Id;
    int TeamId;
}

数据库查询不应该成为一个问题,你的演示文稿和模型层应该试图从关系中抽象出来,如果你不能......说,你需要展示/展示一个团队及其参与者然后你最有可能需要2个数据库查询(如果你不想使用连接并清理重复的字段......团队,在这种情况下)并且我没有看到做出2个单独的数据库查询有什么问题。

修改

我猜方法1使耦合变得更紧,你应该总是避免它,想象一下如果你有机会获得Player类的名字,你必须做出很多改变整个系统。此外,如果您暴露API,您的客户可能会更糟糕。但是,正如我所说,这一切都取决于你的系统的核心要求......如果这些是核心(难以改变)的要求,那么你就不应该担心它。

  

&#34;在哪些情况下,人们可能更喜欢使用变体1&#34;?

同样,这一切都与需求有关,如果您的要求规定团队和玩家之间存在关系,那么只要您可以在两个实体之间建立关系,所有方法都可以。

答案 1 :(得分:1)

我认为,耦合的微小减少的权衡是复杂性的增加。事实上,我怀疑你维护或增加整个应用程序中的耦合量,因为你只是将获取和操作这些对象的责任转移到中间类 - 或者更糟糕的是,你开始将数据访问逻辑合并到你的模型。

答案 2 :(得分:1)

在我看来,答案是:既不是。

在实体框架中,您可以选择两种类型的关联

  • 独立关联,您只能引用另一个对象。一个例子是

    class Player
    {
        int Id;
        Team Team;
    }
    
  • 外键关联,其中有一个引用一个原始外键值:

    class Player
    {
        int Id;
        [ForeignKey("Team")]
        int TeamId;
        Team Team;
    }
    

您的备选方案2)不是一个选项,因为您无法在数据库字段中存储整数列表。此外,你需要什么?没有球员,他们就毫无意义。

来自DDD背景的人总是不赞成外键关联,因为域模型不应该有任何商店实现的概念。但是,当您使用EF时,这是推荐的方法。原因如下:

如果要存储新播放器,可以设置TeamTeamId属性。现在,如果您碰巧有Team,这无所谓。但是,在许多情况下,您只会拥有TeamId(例如,因为它是从下拉列表中选择的)。对于独立关联,您必须首先进行数据库往返以获取Team,然后设置属性。只需设置Id就会更简单,效果更好。

如果您实际上只存储TeamId,那么您没有关联,因此不能将其列为关联的第三种替代方案。而且这不是一个可行的选择。您将始终以某种方式加入以获取关联的Team。但是,如果您想在一次运行中存储新的Team和新的Player,该怎么办?您必须首先存储Team,获取其分配的Id,设置Player的{​​{1}}并存储TeamId,所有这些都包含在Player。使用FK关联,您只需创建对象,设置TransactionScope和EF数字,以便插入对象并为您设置FK值。

所以我想说的是,在优化作为实体框架概念模型的类模型时,DDD原则如松散耦合,关注点分离最好在后台发挥作用。这个类模型是一个域模型,它是一个数据层first and foremost

答案 3 :(得分:0)

除非Id与概念模型相关,否则我不会将其包含在模型中。它似乎是数据库实现的细节,而不是模型的真实部分。

一支球队有球员。它没有玩家ID。

您还应该考虑团队Id是否与您的模型相关。如果你正在模拟(美国)足球比赛,那么球员的球衣上的数字可能很重要。但是你不会显示玩家的员工ID。