实体框架中的形态关系

时间:2016-04-11 14:00:44

标签: c# entity-framework orm

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

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;

1 个答案:

答案 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)