C# EF代码优先关系出现问题

C# EF代码优先关系出现问题,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,好的,这应该很简单,但我有麻烦。我有两个班:地区和地点。一个区域可以有多个位置,但一个位置只能位于一个区域中。简单的东西。以下是我所拥有的: Location Region --------- ------- int LocationID int RegionID string Name string Name string BlahBlah List<Location> Location

好的,这应该很简单,但我有麻烦。我有两个班:地区和地点。一个区域可以有多个位置,但一个位置只能位于一个区域中。简单的东西。以下是我所拥有的:

Location             Region 
---------            -------
int LocationID       int RegionID    
string Name          string Name
string BlahBlah      List<Location> Locations
string OtherStuff
int RegionID
Region Region
位置区域
---------            -------
int LocationID int RegionID
字符串名字符串名
字符串BlahBlah列表位置
串其他东西
内部区域ID
地区
现在我需要在一个区域中添加一个家庭办公室。内政部也是一个地点。实体框架看起来很混乱,所以我显然做错了。这就是我想做的:

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
位置区域
---------            -------
int LocationID int RegionID
字符串名字符串名
字符串BlahBlah列表位置
字符串OtherStuff int HomeOfficeID
int RegionID位置同源办公室
地区
我错过了什么

如果你不喜欢我上面写的内容,这里有一些课程:

 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; }
}
公共类区域
{
public int RegionID{get;set;}
公共字符串名称{get;set;}
public int HomeOfficeID{get;set;}
公共虚拟位置HomeOffice{get;set;}
公共虚拟列表位置{get;set;}
}
公共类位置
{
public int LocationID{get;set;}
公共字符串名称{get;set;}
public int RegionID{get;set;}
公共虚拟区域{get;set;}
}
因此,如果“家庭办公室”除了任何其他位置之外没有其他数据,那么有一个解决方法:

Location             Region 
---------            -------
int LocationID       int RegionID    
string Name          string Name
string BlahBlah      List<Location> Locations
string OtherStuff
int RegionID         
Region Region
bool IsHomeOffice
您还需要一些验证代码,以确保最终不会将多个位置分配给iHomeOffice,但这将帮助您开始


编辑:评论让我意识到,这种方法不允许在所在地区以外的地区设立一个办公室。那会发生吗?第一个想法是不太可能的,但也许“顺势办公”真的意味着一个地区的人力资源员工所在地。目前,总部办公室总是在该地区,但在未来,该公司可能会决定远程为某个地区做人力资源工作。在这个有限的示例中,调整不会太痛苦,但随着数据模型变得更加复杂,当数据模型的结构需要更改时,可能会变得更加痛苦。不是总是依赖于结构来执行规则,而是考虑保持结构灵活,并在条目上添加数据验证。

我会认为,在大多数域中,代码> HOOffice < /代码>很可能不仅仅是一个位置,虽然位置可能是它的属性之一。即使这样,也不能解决循环外键依赖性。我想如果我有一个具有区域和位置属性的HomeOffice类,它可能会变得更容易。你能用这个发布一些代码吗?我认为您的问题在这里已经描述过了:但是如果不知道您的代码或错误是什么,就很难知道如何提供帮助。我想问的问题比你要问的稍微复杂一点。他确实用了一种愚蠢的数据库格式编写了他的代码。他本可以给我们C代码第一类的。这意味着家庭办公室的位置是不可重用的。这可能是一个有效的假设。@Mathew这对我来说似乎是合理的,否则一个地点可能是它不属于的地区的房屋办公室。那没有任何意义。好的,谢谢。你也从代码中删除了一些东西吗?我以为那个地区有int HOMEFFICELOCATIONID之类的东西。在我们的使用中,总公司位置将始终位于实际所在的同一地区。@georgewillow是的,我确实删除了HomeOfficeId,因为这并不必要,因为这意味着存在外键关系。但是,如果需要这些数据,您可以随时调用Region.HomeOffice.LocationID。文章下方还应该有一个经过编辑的通知,您可以单击该通知查看修订历史记录。
public Location HomeOffice
{
    get { return Locations.FirstOrDefault(l => l.IsHomeOffice); }
}