我正在使用带有 Web API 的 Breeze 。我不太了解如何“过滤列”或如何不向我的 Web API 公开整个表。我使用 Entity Framework 作为我的来源,我的两个问题都由 John Papa 在这里解决:http://www.johnpapa.net/spajs04/#comment-113761 并在下面的 Ward Bell 确认是一个很好的解决方案。有人可以告诉我如何使用 Entity Framework 来创建可在我的 webapi 中查询并且可以轻松使用的部分或投影吗?

这是我在 webapi 中的当前功能

[HttpGet]
public IQueryable<Contact> GetContacts()
{
    return _contextProvider.Context.Contact;
}

这是我目前的类(class):
public class Contact
{
    [Key]
    public Guid ID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string NickName { get; set; }
    public string JobTitle { get; set; }
    public DateTime BirthDate { get; set; }
    public bool Gender { get; set; }
    public string SSN { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateUpdated { get; set; }

    public virtual ICollection<Address> Address { get; set; }
}

我想要一个可查询的 webapi 函数,它是我当前的类 而没有 的 SSN 字段。一个适用于“数据库优先”实体且不涉及更改我的数据库或添加“ View ”的解决方案会很棒。

最佳答案

当您尝试减少有效负载时,客户端投影很好。当您必须确保某些数据(例如 SSN)真正安全地对客户端隐藏时,您需要一些服务器端的东西。

@james 建议 - 使用 [NonSerialized] (或 JSON.NET[JsonIgnore] 属性) - 当 SSN 应该 永远不会 转到客户端时,这是一种简单有效的方法。

如果 SSN 在授权情况下应该在客户端上可见(例如,用户查看自己的 SSN 或有权查看 SSN 的 HR 人员),这太不灵活了。 JSON.NET IContractResolver 为您提供了极大的灵活性,可以根据授权规则动态决定哪些属性可以跨越服务边界。

有些人可能会认为用序列化器解决这个问题太过分了。他们可能对您展示的服务器端投影感到满意,@chris_dotnet。顺便说一句,从投影中返回 IQueryable 仍然是有意义的,这样客户端就可以通过过滤查询减少网络负载。

其他人更喜欢定义 DTO ( ContactDTO ) 并通过网络将其序列化。

[HttpGet]
公共(public) IQueryable GetContacts()
{
返回 _contextProvider.Context.Contacts
.Select(p =>
新联系人
{
名字 = p.FirstName,
ID = p.ID,
姓氏 = p.LastName
});
}

这个 IQueryable 比投影版本更健壮,因为过滤可以发生在数据层而不是服务器层。

在客户端,您可以为 ContactDto 类型定义元数据,也可以使用 JsonResultsAdapterContactDto 数据映射到 Contact Breeze 实体。

使用 JsonResultsAdapter 的前提是您实际上希望 Contact 类型 - 在服务器上的业务模型中形成的类型 - 在客户端上是已知的。

您可能不希望从您的服务中公开服务器端 Contact 形状。很多人对此有强烈的感受。如果您是这些人中的一员,那么最好定义一个“DTO 模型”来表示您希望在客户端上看到的实体。这意味着学习为您的 DTO 模型创建元数据并在服务器上编写映射逻辑以在 DTO 和您的业务模型之间移动。

您可以看到所有这些如何成为一个大话题。我很快就会在 Breeze 文档中讨论这个问题。将此答案视为对 future 事物的一种尝试。要点是……您有很好的选择来隐藏用户不应该看到的数据。

关于entity-framework - 在 Web API 中使用实体的部分和投影,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16091496/

10-12 12:43
查看更多