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

chr*_*net 4 entity-framework breeze

我在使用Web API时使用了breeze.我没有很好地掌握如何"过滤列"或如何不将公开表和整个表暴露给我的Web API.我使用实体框架作为我的来源,我的两个问题都由John Papa在这里解决:http://www.johnpapa.net/spajs04/#comment-113761 并且确认是Ward Bell的一个很好的解决方案.有人可以告诉我如何使用实体框架创建可在我的webapi中查询的部分或投影,并将使用微风?

这是我在webapi中的当前功能

[HttpGet]
public IQueryable<Contact> GetContacts()
{
    return _contextProvider.Context.Contact;
}
Run Code Online (Sandbox Code Playgroud)

这是我目前的课程:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我想有一个可查询的webapi函数,它是我当前的类,没有 SSN字段.一个"数据库优先"实体工作的解决方案,并不涉及更改我的数据库或添加"视图"将是伟大的.

War*_*ard 6

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

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

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

有些人可能会考虑使用序列化程序解决这个问题太多了.他们可能会对您展示的服务器端投影表示满意,@ chris_dotnet.顺便说一下,IQueryable从投影中返回一个是有意义的,这样客户端就可以通过过滤查询来减少网络负载.

其他人则更喜欢定义DTO(ContactDTO)并通过线路序列化.

[HttpGet]
    public IQueryable GetContacts()
    {
      return _contextProvider.Context.Contacts
        .Select(p =>
            new ContactDto
            {
                FirstName = p.FirstName,
                ID = p.ID,
                LastName = p.LastName
            });
    }

IQueryable比投影版本更强大,因为过滤可以在数据层而不是服务器层上进行.

在客户端,您可以定义ContactDto类型的元数据,也可以使用a JsonResultsAdapterContactDto数据映射到ContactBreeze实体.

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

您可能不希望Contact从服务中公开服务器端形状.许多人对此非常强烈.如果您是其中一个人,那么最好定义一个代表实体的"DTO模型",以便在客户端上看到它们.这意味着学习为DTO模型创建元数据并在服务器上编写映射逻辑以在DTO和业务模型之间移动.

你可以看到所有这些都可以成为一个大话题.这是我将在Breeze文档中尽快讨论的内容.考虑这个答案,尝试一下即将发生的事情.外卖是......你有很好的选择来隐藏用户不应该看到的数据.