我已经概括了数据模型和数据所概述的问题。我的概括只是让关系保持完整。
我们有一个base模型
Owner
,它捕获了所有者的Pet
,这样我们就可以查看所有所有者并确定他们是Cat
还是Dog
所有者。
我们根据 Pet
将
Owners分为两个表:
CatOwner
和 DogOwner
。这些表捕获了每种所有者类型的独特详细信息。
在特定表格
CatOwner
和DogOwner
中,我们收集信息PetType
,以便我们可以确定他们的宠物是否是:脾气暴躁、友善、可爱等...
业务已定义每个
Type
可以在 Pet
表中包含哪些 PetType
。
Entity Framework Core 中是否有一种机制允许我们以不允许
CatOwner
拥有 PetType
的方式约束数据,其中 PetType.Pet = Dog
?
我知道,一个选项是将
CatType
和 DogType
表添加到数据模型中,然后 CatOwner
将具有 CatType
,而 DogOwner
将具有 DogType
。该解决方案需要向数据模型架构添加通用类型,但我不想这样做,因为这是整个数据模型的一小部分。我们将在 API 中强制执行这种关系,但这不会在数据库引擎中提供任何安全性。
我们不利用Fluent API。我们严重依赖数据注释,这是我们定义关系的首选技术。
Pet {
Id
}
Type {
Id
}
PetType {
Id,
PetId,
TypeId
}
Owner {
Id,
PetId
}
CatOwner {
Id,
OwnerId,
PetTypeId
}
DogOwner {
Id,
OwnerId,
PetTypeId
}
Pet
身份证 |
---|
猫 |
狗 |
Type
身份证 |
---|
脾气暴躁 |
自私 |
友善 |
有帮助 |
可爱 |
PetType
(这些关系由业务定义)
身份证 | 宠物 | 类型 |
---|---|---|
1 | 猫 | 可爱 |
2 | 猫 | 脾气暴躁 |
3 | 猫 | 自私 |
4 | 狗 | 可爱 |
5 | 狗 | 友善 |
6 | 狗 | 有帮助 |
[Index(nameof(PetId), nameof(TypeId), IsUnique = true)]
class PetType
{
int Id { get; set; }
Pet? PetNavigation { get; set; }
[ForeignKey(nameof(PetNavigation)]
int PetId { get; set; }
Type? TypeNavigation { get; set; }
[ForeignKey(nameof(TypeNavigation)]
int TypeId { get; set; }
}
class Owner
{
int Id { get; set; }
Pet? PetNavigation { get; set; }
[ForeignKey(nameof(PetNavigation)]
int PetId { get; set; }
}
class CatOwner
{
int Id { get; set; }
Owner? OwnerNavigation { get; set; }
[ForeignKey(nameof(OwnerNavigation)]
int OwnerId { get; set; }
PetType? PetTypeNavigation { get; set; }
[ForeignKey(nameof(PetTypeNavigation)]
int PetTypeId { get; set; }
}
我已经提出了其他可行的解决方案,在这条路是死胡同的情况下将实施这些解决方案。现在我只是在探索选项并寻找解决问题的新方法。