1

我正在创建一个代码优先的数据库与6.0的实体框架。我有一个组织类,并在C#中定义的相关位置类,如下所示:实体框架代码优先,一对零对一和一对多关系到同一个实体

public class Organisation 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Location> Locations { get; set; } 

    public int? HQLocationId { get; set; } 
    public Location HQLocation { get; set; } 
} 

public class Location 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int OrganisationId { get; set; } 
    public Organisation Organisation { get; set; } 
} 

由于可以从类中推断出,一个组织可以有多个位置,但它只能有一个总部位置

我正在使用Fluent API来配置这些类之间的关系。 “多地点”方面是很简单的,用了以下工作:

HasMany(o => o.Locations) 
     .WithRequired(o => o.Organisation) 
     .HasForeignKey(l => l.OrganisationId); 

我却无法似乎找到了正确的语法定义允许定义HQ位置的关系。如果我采取的方法存在缺陷,或者我只是错过了正确的语法?

UPDATE

如果我添加以下到组织配置:

HasOptional(o => o.HQLocation) 
     .WithMany() 
     .HasForeignKey(o => o.HQLocationId) 
     .WillCascadeOnDelete(true); 

然后实体框架不再错误,并在适合我的需要的形状我的数据负载。

然而,这允许位置要超过一组织HQ;理想情况下我不想要。

回答

0

一到一个一到零或一个关系Id应该是两个实体相同。这意味着Organisation.Id对于HQLocation必须与Location.Id相同。当然,这不是好的设计选择。我的建议是增加财产Location表明它是否是一个HQLocation与否:

public class Organisation 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Location> Locations { get; set; } 
} 

public class Location 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool IsHqLocation { get; set; } 

    public int OrganisationId { get; set; } 
    public Organisation Organisation { get; set; } 
} 
+0

这个解决方案是什么,我会考虑,如果没有其他的选项存在。但是,它允许将任意数量的位置标记为总部。我的设计要求仅适用于每个组织的一个总部。因此,这是提出一个不同的设计,而不是回答这个问题。这就是说......这不是我的倒票;我很欣赏你的建议。 –

相关问题