【发布时间】:2018-02-14 07:01:20
【问题描述】:
我有一个实体表(比方说文档),其中每个文档可能有不同的实体连接到它(比方说权限)。权限具有文档表的外键。
例子:
架构:
Document -> Id | Data
Permission -> Id | EntityId | PermissionData
内容:
Document -> 1 | "This is my first doc"
Permission -> 12 | 1 | "This is doc 1's permission set"
如果Permission 是一个表,我不会有任何问题 - 我只需在查询中使用Include 方法并获得连接权限:
ctx.Include(d => d.Permission)...
但是,Permission 实际上是一个复杂的方案,它包含多个表,并且使用 SQL Server 表值函数进行计算。
我正在尝试创建一个Permission 实体,就像每个常规表实体一样,并且只需将实体框架配置为执行数据库函数调用而不是表连接。
如果权限是一个表并且我会将它包含在我的查询中,我希望 SQL 执行看起来像这样:
select *
from document d
join permission p on d.Id = p.EntityId
我想实现这样的目标:
select *
from document d
join fn_getPermissions(p1,p2,p3...) p on d.Id = p.EntityId
假设参数 p1...pn 是硬编码的,但我需要在 C# 端而不是在 SQL Server 中默认它们。
我看到了一个使用 Entity Framework 配置实体以使用存储过程的选项,但我没有看到任何地方可以使用存储过程进行查询,而不是插入、删除等。
我知道如何调用DBFunctions(使用Conventions)——我不是在寻找显式的函数调用。我想将 Permission 实体视为表实体,主要是因为我在实体框架上使用 OData,并且我不想仅为这种情况创建特定方法。
有没有办法完成这种行为?我使用的是 EF 6.x(不是核心)。
【问题讨论】:
-
您可以创建一个视图,将权限拆分为行,然后您可以随意查询它
-
@Monah - 我想过这样做,但我有多个实体,如文档,我更喜欢以某种方式配置实体框架。
-
您能否提供有关权限数据以及这些实体有何不同的更多详细信息? IMO,这里的视图方法最适合您的情况
-
@Monah - 有多个表定义了权限方案。有多个实体(如文档)在逻辑上共享该权限方案。有一个函数可以进行大量计算并根据输入参数返回答案,我可以在 C# 代码中根据请求全局访问这些参数,因此,我说我现在可以使用硬编码参数。
-
我怀疑这很容易实现 - 实体框架并不以其出色的可扩展性而闻名。
标签: c# sql-server entity-framework table-functions