c# - Web API OData V4 开放类型 - 如何配置 Controller 和数据上下文

标签 c# asp.net entity-framework asp.net-web-api

我有一个包含 Web API OData 服务层的 Multi-Tenancy 应用程序。我有一个支持自定义字段的新要求,这对每个租户都是唯一的,并且向我的表添加通用“customfield01”、“customfield02”列不够灵活。

我探索了多种在后端描述和保存自定义数据的方法,但更具挑战性的部分似乎是扩展我的 odata 服务以包含每个租户的不同自定义字段。

以下链接描述了带有 Web API 的 odata v4 中的“开放类型”:

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/use-open-types-in-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 来取消透视列,但这不起作用,因为我可以为每个动态属性使用不同的数据类型(这对我来说很重要)。

所以,我真的有几个问题:

  1. 上面的 POCO 模型对我要实现的目标有意义吗?
  2. 我的 ItemController 代码应该是什么样子才能包含所有 HTTP 动词(GET、POST、PUT、PATCH、DELETE)的 ItemExtension
  3. 我的数据上下文应该为 ItemExtension 提供什么以允许它访问后端的扩展列
  4. 应如何在后端保留扩展列以支持这一点。

就我所尝试的而言 - 很多事情都行不通,但我已经确定了以下几点(假设没有更好的方法):

  1. 每个具有单独“扩展”的“可扩展”实体的基本 POCO 每个实体(如上面的模型)

  2. 在后端,由于我需要无限的灵 active 和强大的数据类型,我计划为每个租户/实体组合创建一个单独的扩展表(将命名为 [TenantId].[ItemExtension] 每列根据需要命名和键入)。

我缺少的是我的数据和模型之间的一切。任何帮助将不胜感激。

最佳答案

如果您真的不想使用 ORM 创建存储过程实体类型对象类,您可以简单地使用 FOR JSON PATH 从 SQL 存储过程本身检索 json 对象并将其扔给客户端。

例如 - Reference Link

关于c# - Web API OData V4 开放类型 - 如何配置 Controller 和数据上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32654829/

相关文章:

c# - WPF 表单与后台线程锁定

C# SqlCommand - 将结果集设置为变量

c# - LINQ 按名称排序 ThenBy ChildrenCollection.Name

c# - 为什么 ASP.NET Core 不能并行处理我的请求?

asp.net - 使用 VS2012 加密 Azure 的连接字符串

c# - Linq to Entities 通过变量列表获取实体列表

c# - 返回具有匿名类型的已过滤 IQueryable<T>

c# - 如何向 Image 类等内容添加基本属性?

c# - 控件的自定义设计器

javascript - 指定单击链接时要加载的 xml 文件