实体框架中的形态关系
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)
【讨论】:
以上是关于实体框架中的形态关系的主要内容,如果未能解决你的问题,请参考以下文章