在 Entity Framework 中使用父子 FK
Using Parent and Child FK in Entity Framework
在某些情况下,在 table 中使用外键,FK 与另一个 table 具有父或子关系,如下所示:
员工:
Id | Name | CityId |
-------------------------
1001 | John | 1 |
1002 | Mary | 2 |
1003 | Bill | 3 |
1004 | Jose | 4 |
1005 | Anna | 5 |
城市:
Id | Name | CountryId |
----------------------------
1 | NY | 101 |
2 | Paris | 102 |
3 | London | 103 |
4 | Rome | 104 |
5 | Tokyo | 105 |
国家:
Id | Name |
---------------
101 | USA |
102 | France |
103 | UK |
104 | Italy |
105 | Japan |
我的问题是:我们应该只使用 CityId 作为 Staff 实体中的 FK,还是在 Staff 实体中包含 CityId 及其父 CountryId 更好?当然把一个FK和它的parent作为FK包含似乎是多余的,但是我想澄清的是,在使用这样的级联关系之王时是否有一些情况或要求?应该使用哪一个?
我会避免破坏规范化,因为没有简单的方法来保证员工的国家/地区参考和城市的国家/地区参考保持同步。例如,员工可能将城市设置为 "Toronto",将国家/地区设置为 "Canada",但随后在某个地方将城市更新为 "Boston",但未更新 Staff.Country .工作人员说国家是 "Canada",而城市说国家是 "USA"。谁是可信的真相来源?
在显示有关员工的信息时,使用视图模型来扁平化相关细节。如果你想显示带有国家名称的员工详细信息,而没有关于城市的其他信息,视图模型可以根据从实体中选择的数据来公开它。例如:
var staffViewModels = context.Staff
.Select(x => new StaffViewModel
{
StaffId = x.Id,
Name = x.Name,
Country = x.City.Country.Name
}).ToList();
即使该结构为员工引入了一个地址,其中包含一个与国家相关的城市:
var staffViewModels = context.Staff
.Select(x => new StaffViewModel
{
StaffId = x.Id,
Name = x.Name,
Country = x.Address.City.Country.Name
}).ToList();
实体可以保持规范化并生成 SQL 以有效访问相关数据。
在某些情况下,在 table 中使用外键,FK 与另一个 table 具有父或子关系,如下所示:
员工:
Id | Name | CityId |
-------------------------
1001 | John | 1 |
1002 | Mary | 2 |
1003 | Bill | 3 |
1004 | Jose | 4 |
1005 | Anna | 5 |
城市:
Id | Name | CountryId |
----------------------------
1 | NY | 101 |
2 | Paris | 102 |
3 | London | 103 |
4 | Rome | 104 |
5 | Tokyo | 105 |
国家:
Id | Name |
---------------
101 | USA |
102 | France |
103 | UK |
104 | Italy |
105 | Japan |
我的问题是:我们应该只使用 CityId 作为 Staff 实体中的 FK,还是在 Staff 实体中包含 CityId 及其父 CountryId 更好?当然把一个FK和它的parent作为FK包含似乎是多余的,但是我想澄清的是,在使用这样的级联关系之王时是否有一些情况或要求?应该使用哪一个?
我会避免破坏规范化,因为没有简单的方法来保证员工的国家/地区参考和城市的国家/地区参考保持同步。例如,员工可能将城市设置为 "Toronto",将国家/地区设置为 "Canada",但随后在某个地方将城市更新为 "Boston",但未更新 Staff.Country .工作人员说国家是 "Canada",而城市说国家是 "USA"。谁是可信的真相来源?
在显示有关员工的信息时,使用视图模型来扁平化相关细节。如果你想显示带有国家名称的员工详细信息,而没有关于城市的其他信息,视图模型可以根据从实体中选择的数据来公开它。例如:
var staffViewModels = context.Staff
.Select(x => new StaffViewModel
{
StaffId = x.Id,
Name = x.Name,
Country = x.City.Country.Name
}).ToList();
即使该结构为员工引入了一个地址,其中包含一个与国家相关的城市:
var staffViewModels = context.Staff
.Select(x => new StaffViewModel
{
StaffId = x.Id,
Name = x.Name,
Country = x.Address.City.Country.Name
}).ToList();
实体可以保持规范化并生成 SQL 以有效访问相关数据。