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字段.一个"数据库优先"实体工作的解决方案,并不涉及更改我的数据库或添加"视图"将是伟大的.
当您尝试减少有效负载时,客户端投影很好.当您必须确保某些数据(例如,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 JsonResultsAdapter将ContactDto数据映射到ContactBreeze实体.
使用JsonResultsAdapter您实际想要的Contact类型 - 在服务器上的业务模型中形成的类型 - 在客户端上是已知的.
您可能不希望Contact从服务中公开服务器端形状.许多人对此非常强烈.如果您是其中一个人,那么最好定义一个代表实体的"DTO模型",以便在客户端上看到它们.这意味着学习为DTO模型创建元数据并在服务器上编写映射逻辑以在DTO和业务模型之间移动.
你可以看到所有这些都可以成为一个大话题.这是我将在Breeze文档中尽快讨论的内容.考虑这个答案,尝试一下即将发生的事情.外卖是......你有很好的选择来隐藏用户不应该看到的数据.
| 归档时间: |
|
| 查看次数: |
1711 次 |
| 最近记录: |