gpt4 book ai didi

entity-framework - 在 Web API 中使用实体的部分和投影

转载 作者:行者123 更新时间:2023-12-04 07:25:05 24 4
gpt4 key购买 nike

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

这是我在 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 函数,它是我当前的类(class) 没有 SSN 字段。一个“数据库优先”实体且不涉及更改我的数据库或添加“ View ”的解决方案会很棒。

最佳答案

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

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

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

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

其他人会更喜欢定义一个 DTO ( ContactDTO ) 并通过网络对其进行序列化。

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

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

在客户端,您可以为 ContactDto 定义元数据。输入或您可以使用 JsonResultsAdapter映射ContactDto数据到 Contact Breeze 实体。

使用 JsonResultsAdapter假设您确实想要 Contact type - 在服务器上的业务模型中形成的类型 - 在客户端上是已知的。

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

您可以看到所有这些如何成为一个大话题。这是我将很快在 Breeze 文档中讨论的内容。将这个答案视为即将发生的事情的味道。要点是……您有很好的选择来隐藏用户不应该看到的数据。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com