当前位置:  开发笔记 > 编程语言 > 正文

你如何打破实体之间的循环关联?

如何解决《你如何打破实体之间的循环关联?》经验,为你挑选了2个好方法。

我第一次在网站上如果标记错误或在其他地方得到回答,请道歉...

我一直在处理当前项目中的特定情况,我想知道你们如何处理它.模式是:父项具有子集合,父项具有对子集合中特定项的一个或多个引用,通常是"默认"子项.

一个更具体的例子:

public class SystemMenu 
{
    public IList Items { get; private set; }
    public MenuItem DefaultItem { get; set; }
}

public class MenuItem
{
    public SystemMenu Parent { get; set; }
    public string Name { get; set; }
}

对我而言,这似乎是建立关系的一种很好的干净方式,但由于循环关联而立即导致问题,由于循环外键,我无法强制执行DB中的关系,并且LINQ to SQL因为循环关联.即使我能绕道而行,但这显然不是一个好主意.

我目前唯一的想法是在MenuItem上有一个'IsDefault'标志:

public class SystemMenu 
{
    public IList Items { get; private set; }
    public MenuItem DefaultItem 
    {
        get 
        {
            return Items.Single(x => x.IsDefault);
        }
        set
        {
            DefaultItem.IsDefault = false;
            value.DefaultItem = true;
        }
    }
}

public class MenuItem
{
    public SystemMenu Parent { get; set; }
    public string Name { get; set; }
    public bool IsDefault { get; set; }
}

有没有人处理类似的事情,可以提供一些建议?

干杯!

编辑:感谢到目前为止的回复,也许"菜单"的例子并不精彩,但是我试图想出一些具有代表性的东西,所以我不必深入研究我们不那么自我解释的领域的细节模型!也许更好的例子是公司/员工关系:

public class Company
{
    public string Name { get; set; }
    public IList Employees { get; private set; }
    public Employee ContactPerson { get; set; }
}

public class Employee
{
    public Company EmployedBy { get; set; }
    public string FullName { get; set; }
}

员工肯定需要参考他们的公司,每个公司只能有一个ContactPerson.希望这让我原来的观点更加清晰!



1> 小智..:

解决这个问题的诀窍是要意识到父母不需要知道孩子的所有方法,并且孩子不需要知道父母的所有方法.因此,您可以使用接口隔离原则来解耦它们.

简而言之,您为父级创建了一个界面,该界面只包含子级所需的那些方法.您还为子级创建了一个只有父级需要的方法的接口.然后,您让父级包含子接口的列表,并让子级指向父接口.我将其称为Flip Flob Pattern,因为UML图具有Eckles-Jordan触发器的几何形状(Sue me,我是一位老硬件工程师!)

  |ISystemMenu|<-+    +->|IMenuItem|
          A    1  \  / *     A
          |        \/        |
          |        /\        |
          |       /  \       |
          |      /    \      |
          |     /      \     |
    |SystemMenu|        |MenuItem|

请注意,此图中没有循环.你不能从一个班级开始,然后按箭头回到起点.

有时,为了使分离恰到好处,你必须移动一些方法.可能存在您认为应该在SystemMenu中移动到MenuItem等的代码.但是通常该技术运行良好.



2> David Norman..:

你的解决方案似乎很合理.

另一件需要考虑的事情是内存中的对象不必与数据库模式完全匹配.在数据库中,您可以使用具有子属性的更简单的模式,但在内存中,您可以优化事物并让父对象具有对子对象的引用.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有