实体框架中的形态关系

Posted

技术标签:

【中文标题】实体框架中的形态关系【英文标题】:Morphological Relationship in Entity Framework 【发布时间】:2016-04-11 14:00:44 【问题描述】:

假设我有一个包含以下表格的数据库设置:

Project    User     Properties
-------    ----     ---------- 
id         id       id
name       name     key
                    value
                    owner_type
                    owner_id

我希望 Project 和 User 实体都能够拥有属性。属性上的 owner_type 字段匹配,例如,表名称和 owner_id 匹配 owner_type-table 中的某些行。

我无法弄清楚如何在实体框架中执行此操作。我想我需要编写某种自定义关系,但我不知道如何。

编辑: 我不是在寻找一对一或一对多的关系。我明白这是如何工作的。这个问题可以通过为每个可以具有属性的实体的数据透视表来解决,但这不是我想要的。

我正在寻找这样的关系(可能使用计算列):

--- Select the properties for Project `10`
SELECT * FROM Properties WHERE owner_type = 'ProjectEntityName' AND owner_id = 10
--- Select the properties for User `2`
SELECT * FROM Properties WHERE owner_type = 'UserEntityName' AND owner_id = 2

我知道 Laravel 在 Eloquent 中有这些关系,但我在 Entity Framework 中需要它们。不是一些默认支持的东西没问题,但我希望能够使用如下语法访问属性:

var project_properties = cx.Project.Where(p => p.id = 2).Properties;

【问题讨论】:

【参考方案1】:

避免映射到特定于 Sql Server 数据库的系统表。

属性属于一个类,所以在你的模型中创建 Class 实体,带有一个 id 和一个名称。

使用继承,为“Project”和“User”创建一个基础对象,例如“DbObject”,作为属性“id”和“name”。

在 DbObject 表中添加一个 class_id 字段作为类表的外键。

在属性表中添加一个 class_id 字段作为类表的外键。

在您的对象模型中,类 Properties 在 Class 上有一个导航属性。

Class
-------
id
name

DbObject   Properties
-------    ---------- 
id         id
class_id   class_id
name       key
           value
           owner_type
           owner_id

Project : DbObject   User : DbObject 
-------              ----  
(project             (user
specific             specific
attributes)          attributes) 

【讨论】:

以上是关于实体框架中的形态关系的主要内容,如果未能解决你的问题,请参考以下文章

实体框架中的自引用/父子关系

Remove() 不适用于实体框架中的多对多关系

实体框架中的可选一对多关系[关闭]

使用实体框架中的导航属性填充多对多关系表

实体框架4.1代码优先中的一对多关系

将关系映射到实体框架中的抽象集合