防止OData $ extend行为返回实体

时间:2013-12-11 12:35:54

标签: c# asp.net odata asp.net-web-api-odata

在我的实体模型中,我有大量实体链接到创建它们的用户。这是一个简单的例子......

public partial class JobNote
{
    public int Id { get; set; }
    public int JobId { get; set; }
    public string Note { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public int UserId { get; set; }
    public bool IsDeleted { get; set; }

    public virtual Job Job { get; set; }
    public virtual User User { get; set; }
}

我想通过OData端点公开JobNotes,但我不希望此时公开用户,因为它包含密码和哈希盐。

如果我只是从我的OData模型中删除edmxModelBuilder.EntitySet<EF.User>("Users")行,那么我就无法获得JobNote或与用户关联的任何其他对象。

如果我从实体框架模型中删除密码和salt属性,我无法使用我的模型在应用程序的其他区域验证我的用户。我可以解决这个问题,但我认为这是最后的手段,而不是修复。

我正在考虑为User属性使用HasNavigationPropertyLink方法,但我真的不明白它是如何工作的。

编辑: 好的,我已经创建了导航属性链接....

var noteConfig = edmxModelBuilder.EntitySet<EF.JobNote>("JobNotes");

IEdmModel edmxModel = edmxModelBuilder.GetEdmModel();   

noteConfig.HasNavigationPropertyLink(
       noteConfig.EntityType.NavigationProperties.Single(x => x.Name == "User"),
       (entityContext, navigationProperty) =>
           new Uri(entityContext.Url.ODataLink(
               new EntitySetPathSegment("Users"),
               new KeyValuePathSegment(entityContext.EntityInstance.Id.ToString()),
               new NavigationPathSegment(navigationProperty.Name))),
       false);

......但它给了我同样的问题。我认为这是因为我在构建模型后更新了配置,但我无法重新构建并重新分配它。

1 个答案:

答案 0 :(得分:1)

我猜你不想从实体框架映射中删除te密码和salt。在edm模型映射中,您也可以忽略属性,因此它不会在odata中公开。

modelBuilder.Entity()。忽略(u =&gt; u.PasswordHash);

您也可以以相同的方式忽略整个用户属性