基于 Entity Framework Core 中的隐式关系约束数据

问题描述 投票:0回答:1

我已经概括了数据模型数据所概述的问题。我的概括只是让关系保持完整。

问题

我们有一个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; }
}

我已经提出了其他可行的解决方案,在这条路是死胡同的情况下将实施这些解决方案。现在我只是在探索选项并寻找解决问题的新方法。

c# database asp.net-core entity-framework-core relational-database
1个回答
0
投票

为什么还要有 CatOwner 和 DogOwner 这样的表?您需要为每种类型的宠物准备一张桌子。只需使用连接表即可:

© www.soinside.com 2019 - 2024. All rights reserved.