首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的多到多对象对对象关系

C#中的多到多对象对对象关系
EN

Stack Overflow用户
提问于 2009-04-22 11:00:33
回答 3查看 4.5K关注 0票数 8

我正在做一个小的教育项目来练习perst.net。

我们有一个很小的设计问题,那就是如何最好地解决两类对象之间的关系,那就是参与者和冠军。这是一个多到多的关系,因为参与者可以参加许多锦标赛,锦标赛可以有多个参与者。

请建议如何在C#中最好地做到这一点,我应该使用“关系数据库类似”的技术类吗?

EN

回答 3

Stack Overflow用户

发布于 2009-04-22 11:15:57

如果您正在寻找面向对象(或域驱动的设计)方法,那么第三个处理“联接”的对象是完全错误的。您可以使用ILists /数字与添加.处理此问题的方法如下:

代码语言:javascript
复制
public class Participant
{
    private readonly IList<Championship> _championships = new List<Championship>();

    public IEnumerable<Championship> Championships
    {
        get { return _championships; }
    }

    internal void AddChampionship(Championship championship)
    {
        if (!_championships.Contains(championship))
            _championships.Add(championship);
    }
}

public class Championship
{
    private readonly IList<Participant> _participants = new List<Participant>();

    public IEnumerable<Participant> Participants
    {
        get { return _participants; }
    }

    public void AddParticipant(Participant participant)
    {
        if (_participants.Contains(participant)) return;
        _participants.Add(participant);
        participant.AddChampionship(this);
    }
}

这里的关键是确保您只从一方管理关系-例如,在本例中,通过调用championship.AddParticipant()

票数 10
EN

Stack Overflow用户

发布于 2009-04-22 11:13:28

在特定项可以使用IEnumerable (或其他集合)属性与其关联多个项的情况下,可以有任何关系。在您的示例中,如下所示:

代码语言:javascript
复制
class Participant {
   public IEnumerable<Championship> Championships { 
      get {
         return _championships;
      }
   }
   private List<Championship> _championships;
}

一些重要的事情要记住:

  • 总是使它成为只读属性。这有时会让人感到困惑,特别是如果您有一些可以修改的东西,比如返回的ICollection而不是IEnumerable。使属性只读并不阻止对集合的修改,而是对整个列表的修改。
  • 加载策略--在上面的示例中,您会注意到集合并没有失效。通常在构造函数中或者在属性首次被访问时(称为惰性实例化)--通常来说,延迟实例化会增加一些复杂性,但是可以提高性能,特别是如果这个集合不经常使用或者您有很多这样的properties.
  • Generally,,那么在多到多的情况下,选择一个类来“保存”另一个类是个好主意(例如,参与者有冠军属性,但冠军没有参与者属性,反之亦然)。这减少了您必须编写的代码数量,并降低了数据库的复杂性和表面积。如果另一个方向需要调用,请考虑方法调用,而不是属性。请记住,从关系意义上讲,多到多并不一定意味着这是常见的用例(作为一个用户,我可能只想将参与者添加到锦标赛中,而不是将冠军添加到participants)
  • If中,您的集合是可以修改的,请记住,发送保存意味着如果更改了它们,它下面的集合也应该被修改。这可以增加很大的复杂性(在过去,我使用内部列表来存储添加/删除的项目)
票数 4
EN

Stack Overflow用户

发布于 2009-04-22 11:12:07

我不确定这是否适用于你的设计或要求,但可能.

显然,多到多的关系最容易用管理关系的第三个对象来表示。在你的情况下,这将是一个锦标赛的参与者。与其在您的参与者类中拥有举办锦标赛的集合,反之亦然,让他们拥有第三类的实例。冠军参与者对象管理这种关系。然后,它可以作为连接表直接序列化到数据库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/776645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档