首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最好在EF模型中隐藏敏感字段,还是创建一个新的类?

最好在EF模型中隐藏敏感字段,还是创建一个新的类?
EN

Stack Overflow用户
提问于 2018-01-15 20:52:48
回答 2查看 223关注 0票数 1

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

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

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

示例:

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-15 21:03:47

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

票数 3
EN

Stack Overflow用户

发布于 2018-01-15 22:24:29

永远不要将数据库模型作为最终用户的结果,并将其与表示/应用程序层分开。

你会遇到这么多问题:

  • 敏感数据的披露(你已经提到);
  • 性能问题和RAM和CPU的浪费(例如,您有具有数十个属性的Order实体,最好只加载那些需要的属性,而不是全部);
  • 序列化的问题(如果启用了延迟加载,例如MVC可以尝试使用导航属性序列化整个对象.);
  • 等等。

我想推荐以下几点:

  • 必要时从存储层返回原始数据库实体,但不要忘记将其转换到另一个全新的xxxModel、xxxViewModel、xxxResponse等全新的表示层;
  • 如果希望实现最佳优化,则从存储层返回xxxView,但不要忘记将其转换到表示层以实现全新的对象。(对某一层的任何更改都不应影响其他层,特别是终端用户);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48270501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档