【问题标题】:Get only parent class data entity framework只获取父类数据实体框架
【发布时间】:2017-02-13 10:30:09
【问题描述】:

我有一些带有子对象的类。当我检索数据并将其转换为 JSON(例如转换为 DeviceType 类)时,它也会返回来自相关子实体的数据。如何在不设置Ignore 属性或ProxyCreationEnabled 的情况下避免获取子实体的数据?在某些情况下,我还需要子类数据。

请参见下面的代码:当我为DeviceTypes 选择数据时,它也会返回Devices。现在我使用Select 只获取我需要的字段,但随着应用程序的增长,将难以处理。由于我使用的是动态类型,因此我只能将其作为对象返回。

public partial class DeviceType
{

    public DeviceType()
    {
        this.Devices = new HashSet<Devices >();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
    public string Code { get; set; }

    public virtual ICollection<Device> Devices { get; set; }
}

public override ICollection<DeviceType> Get()
{
    return DbContext.Set<DeviceType>().ToList().Select(x => new DeviceType
    {
       Id = x.Id,
       Name =  x.Name
    }).ToList();
}

【问题讨论】:

    标签: c# entity-framework linq model-view-controller


    【解决方案1】:

    表现出这种行为的不是 EF,而是您的 JSON 序列化程序(可能是 Newtonsoft.Json)。子数据实际上不存在,它们是延迟加载的。发生这种情况实际上是一个严重的问题(不是 Newtonsoft.Json,而是您如何使用数据)。除非另有说明,否则 Json 序列化程序将简单地反映您的类,查找其所有属性(包括集合),遍历它们并将找到的所有内容序列化为 JSON。因此,即使您正在使用的对象实际上包含该集合作为第一次访问时加载的惰性集合,JSON 序列化程序确实会看到它并将其包含在内。

    问题原因详细here,请阅读。

    解决问题的方法,简而言之,在上面的链接中详细说明:不要发送您的数据库实体。除了可能是 Select N+1 问题的来源之外,它还是一个巨大的安全漏洞。改用视图模型并将数据投影到其中:

    public IEnumerable<ResultViewModel> GetData()
    {
        return dbItemsAsQueryable.Select(item => new ResultViewModel
        {
            Id = item.Id,
            Name = item.Name,
            // other properties
        }).ToList();
    
    }
    

    通过将后备存储用作IQueryable,您不仅可以避免选择 N+1(因为查询将被转换为适当的联接),而且您还可以解决安全问题,因为您没有选择不会是那里。换句话说,您只公开您真正想要公开的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2015-09-01
      • 2017-05-23
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多