在 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 以有效访问相关数据。