EF Code First关系问题

3

好的,这个问题应该很简单,但我遇到了麻烦。我有两个类:区域和位置。一个区域可以有很多位置,但一个位置只能属于一个区域。非常简单。这是我的代码:

Location             Region 
---------            -------
int LocationID       int RegionID    
string Name          string Name
string BlahBlah      List<Location> Locations
string OtherStuff
int RegionID
Region Region

现在我需要将一个家庭办公室添加到一个区域中。家庭办公室也是一个位置。Entity Framework似乎很困惑,所以我显然做错了什么。这就是我试图做的事情:

Location             Region 
---------            -------
int LocationID       int RegionID    
string Name          string Name
string BlahBlah      List<Location> Locations
string OtherStuff    int HomeOfficeID
int RegionID         Location HomeOffice
Region Region

我在这里漏掉了什么?

如果您不喜欢我上面写的内容,这里是类:

 public class Region
{
    public int RegionID { get; set; }
    public string Name { get; set; }       
    public int HomeOfficeID { get; set; }
    public virtual Location HomeOffice { get; set; }
    public virtual List<Location> Locations { get; set; }
}

 public class Location
{
    public int LocationID { get; set; }
    public string Name { get; set; }              
    public int RegionID { get; set; }
    public virtual Region Region { get; set; }
}

2
我认为在大多数领域中,“HomeOffice”很可能不仅仅是一个位置,尽管位置可能是其属性之一。 - Alex
即便如此,这也无法解决循环外键依赖关系。 - Aron
如果我有一个HomeOffice类,它具有区域和位置属性,那么这可能会更容易。 - georgewillow
你能贴一些相关的代码吗?我认为你所询问的问题在这里已经有描述:https://dev59.com/N1jUa4cB1Zd3GeqPPkAm 但是,如果不知道你的代码或者你遇到的错误是什么,那么很难提供帮助。我所提供的链接中的问题比你所问的稍微复杂一些。 - Matthew
这些类会有所帮助,例如在Region中,LocationsHomeOffice是否都是虚拟的? - Matthew
显示剩余2条评论
1个回答

1

所以如果“家庭办公室”确实没有比任何其他位置更多的数据,那么就有一个解决方法:

Location             Region 
---------            -------
int LocationID       int RegionID    
string Name          string Name
string BlahBlah      List<Location> Locations
string OtherStuff
int RegionID         
Region Region
bool IsHomeOffice

现在,Region 获得了一个只读属性:
public Location HomeOffice
{
    get { return Locations.FirstOrDefault(l => l.IsHomeOffice); }
}

你还需要一些验证代码来确保不会将多个位置分配给IsHomeOffice,但这将让你有一个好的开始。
编辑:评论让我意识到这种方法不允许将HomeOffice放置在其所在的区域之外。这可能会发生吗?第一个想法是不太可能,但也许“HomeOffice”真的意味着某个区域的人力资源人员所在的地方。现在,HomeOffice总是在区域内部,但将来该公司可能决定远程处理某个区域的人力资源。在这个有限的示例中,适应起来不会太痛苦,但随着数据模型变得更加复杂,当数据模型的结构需要改变时,它可能会变得更加痛苦。考虑保持结构的灵活性,并在输入时添加数据验证,而不是总是依赖结构来强制执行规则。

这意味着Home Office位置不可重复使用。这可能是一个有效的假设。 - Matthew
@Mathew 这对我来说似乎是合理的,否则一个位置可能会成为不属于它的区域的HomeOffice。那样就没有任何意义了。 - cadrell0
好的,谢谢。你从代码中删除了什么吗?我记得Region有int HomeOfficeLocationID或类似的东西。在我们的使用中,总部所在地将始终与实际位置处于同一地区。 - georgewillow
@georgewillow 是的,我已经删除了HomeOfficeId,因为它不是必需的,因为那意味着一个外键关系。但是如果您需要该数据,您可以随时调用Region.HomeOffice.LocationID。帖子下面还应该有一个编辑过的<time ago>通知,您可以单击以查看修订历史记录。 - User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接