更好的做法是隐藏EF模型中的敏感字段或创建新类?

时间:2018-01-15 20:52:49

标签: c# entity-framework asp.net-web-api entity-framework-6

我使用代码优先实体框架来建模和创建我的数据库。

我只是想知道 - 当我向用户返回对象时 - 我不想返回像id这样的数据敏感字段。

我应该在返回给用户时添加像[DoNotReturn]这样的atttibute结合过滤器来删除这些字段,还是应该创建一个不包含这些字段的全新类?

示例:

public class UserAccount
{
    //Option 1 - Hide fields
    [DoNotReturn]
    public int Id { get; set; }

    [Index(IsUnique = true)]
    [MaxLength(50)]
    public string Username { get; set; }

    public decimal Cash { get; set; }

    [DoNotReturn]
    public Account Account { get; set; } //Contains Email / Password

    //Option 2 - return a `safe` version
    public User UserAccountToFriendly() {
        return new FriendlyUser(this.Username, this.Cash);
    }
}

2 个答案:

答案 0 :(得分:3)

将您的数据库模型与您的视图模型分开,这是我采用的方法,并且已经做了很长时间。它会给你一个很好的分离。一旦开始处理ViewModel,就可以使用像Automapper或自定义映射类这样的库将ViewModel转换为数据库模型,反之亦然。我希望它有所帮助

答案 1 :(得分:2)

永远不要将数据库模型用作最终用户的结果,并将其与Presentation / Application层分开。

你会遇到很多问题:

  • 披露敏感数据(您已经提到过);
  • 性能问题以及RAM和CPU的浪费(例如,您有具有许多属性的Order实体,最好只加载所有需要的属性);
  • 序列化问题(启用延迟加载,例如MVC可能尝试使用导航属性序列化整个对象......);
  • 等...

我想推荐以下内容:

    如果需要,
  • 从Repository层返回原始数据库实体,但不要忘记将它在Presentation层上转换为另一个全新的xxxModel,xxxViewModel,xxxResponse等;
  • 如果要实现最佳优化,请从Repository层返回xxxView,但不要忘记将它在Presentation层上转换为全新对象。 (一层上的任何更改都不应影响其他层,尤其是最终用户);