假设我有一个包含以下表格的数据库设置:
Project User Properties
------- ---- ----------
id id id
name name key
value
owner_type
owner_id
我希望Project和User实体都能拥有属性。属性上的owner_type字段匹配,例如,表名称和owner_id匹配owner_type-table中的某些行。
我无法弄清楚如何在Entity Framework中执行此操作。我想我需要写一些自定义关系,但我无法弄清楚如何。
修改 我不是在寻找一对一或一对多的关系。我明白这是如何运作的。对于每个可以拥有属性的实体,使用数据透视表可以解决此问题,但这不是我想要的。
我正在寻找一种类似这样的关系(可能使用计算列):
--- 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;
答案 0 :(得分:0)
避免映射到特定于Sql Server数据库的系统表。
属性属于一个类,因此在模型中创建具有id和名称的Class实体。
使用继承,为'Project'和'User'创建一个基础对象,例如'DbObject',作为属性'id'和'name'。
在DbObject表中添加一个class_id字段作为类表上的外键。
在Properties表中添加class_id字段作为Class Table上的外键。
在对象模型中,类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)