我有一个包含 Web API OData 服务层的 Multi-Tenancy 应用程序。我有一个支持自定义字段的新要求,这对每个租户都是唯一的,并且向我的表添加通用“customfield01”、“customfield02”列不够灵活。
我探索了多种在后端描述和保存自定义数据的方法,但更具挑战性的部分似乎是扩展我的 odata 服务以包含每个租户的不同自定义字段。
以下链接描述了带有 Web API 的 odata v4 中的“开放类型”:
示例代码运行良好,并提供了我需要的实体动态属性行为。但是,该代码仅使用后端的硬编码值列表。完全不清楚如何从 Entity Framework 数据上下文填充实体。
起初,对于每个租户来说,这似乎就像在数据库中拥有特定于租户的 View 一样简单,但问题是扩展属性确实需要从列“逆透视”到键中 -值对。因此,我想知道我是否需要为“扩展”属性创建一个单独的实体。所以,我可以为我的 POCO 准备这样的东西:
public class Item
{
[Key]
public Guid ItemId { get; set; }
public Guid TenantId { get; set; }
// navigation property for the extension entity
public virtual ItemExtension ItemExtension { get; set; }
}
public class ItemExtension
{
[Key]
public Guid ItemId { get; set; }
// dynamic properties for the open type
public IDictionary<string, object> DynamicProperties { get; set; }}
}
但是,问题又变成了如何用我的数据上下文中的数据填充这些对象。再一次,我想我可以有一个 View 来取消透视列,但这不起作用,因为我可以为每个动态属性使用不同的数据类型(这对我来说很重要)。
所以,我真的有几个问题:
- 上面的 POCO 模型对我要实现的目标有意义吗?
- 我的 ItemController 代码应该是什么样子才能包含所有 HTTP 动词(GET、POST、PUT、PATCH、DELETE)的 ItemExtension
- 我的数据上下文应该为 ItemExtension 提供什么以允许它访问后端的扩展列
- 应如何在后端保留扩展列以支持这一点。
就我所尝试的而言 - 很多事情都行不通,但我已经确定了以下几点(假设没有更好的方法):
每个具有单独“扩展”的“可扩展”实体的基本 POCO 每个实体(如上面的模型)
在后端,由于我需要无限的灵 active 和强大的数据类型,我计划为每个租户/实体组合创建一个单独的扩展表(将命名为 [TenantId].[ItemExtension] 每列根据需要命名和键入)。
我缺少的是我的数据和模型之间的一切。任何帮助将不胜感激。
最佳答案
如果您真的不想使用 ORM 创建存储过程实体类型对象类,您可以简单地使用 FOR JSON PATH 从 SQL 存储过程本身检索 json 对象并将其扔给客户端。
例如 - Reference Link
关于c# - Web API OData V4 开放类型 - 如何配置 Controller 和数据上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32654829/