Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅获取父类数据实体框架_C#_Entity Framework_Linq_Model View Controller - Fatal编程技术网

C# 仅获取父类数据实体框架

C# 仅获取父类数据实体框架,c#,entity-framework,linq,model-view-controller,C#,Entity Framework,Linq,Model View Controller,我有几个带有子对象的类。当我检索数据并将其转换为JSON(例如转换为类DeviceType)时,它也会从相关子实体返回数据。如果不设置Ignore属性或ProxyCreationEnabled,如何避免获取子实体的数据?在某些情况下,我还需要子类数据 请参见下面的代码:当我为设备类型选择数据时,它也会返回设备。现在我使用Select只获取我需要的字段,但是随着应用程序的增长,它将很难处理。因为我使用的是动态类型,所以只能将其作为对象返回 public partial class DeviceTy

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

请参见下面的代码:当我为
设备类型
选择数据时,它也会返回
设备
。现在我使用
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();
}
公共部分类设备类型
{
公共设备类型()
{
this.Devices=new HashSet();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
公共字符串代码{get;set;}
公共虚拟ICollection设备{get;set;}
}
公共覆盖ICollection Get()
{
返回DbContext.Set().ToList().Select(x=>newDeviceType
{
Id=x.Id,
Name=x.Name
}).ToList();
}

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

这是一个问题的原因是详细的,请阅读

解决问题的方法,简单地说,在上面的链接中有详细说明:不要发送您的DB实体。除了可能导致选择性N+1问题外,它还是一个巨大的安全漏洞。改用viewmodels并将数据投影到其中:

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

}
public IEnumerable GetData()
{
返回dbItemsAsQueryable.Select(item=>newresultviewmodel
{
Id=项目Id,
名称=项。名称,
//其他属性
}).ToList();
}

通过将备份存储用作
IQueryable
,不仅可以避免选择N+1(因为查询将转换为适当的联接),而且还可以解决安全问题,因为不选择的内容将不存在。换句话说,您只公开您实际想要公开的数据。

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

这是一个问题的原因是详细的,请阅读

解决问题的方法,简单地说,在上面的链接中有详细说明:不要发送您的DB实体。除了可能导致选择性N+1问题外,它还是一个巨大的安全漏洞。改用viewmodels并将数据投影到其中:

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

}
public IEnumerable GetData()
{
返回dbItemsAsQueryable.Select(item=>newresultviewmodel
{
Id=项目Id,
名称=项。名称,
//其他属性
}).ToList();
}
通过将备份存储用作
IQueryable
,不仅可以避免选择N+1(因为查询将转换为适当的联接),而且还可以解决安全问题,因为不选择的内容将不存在。换句话说,您只公开您实际想要公开的数据