繁体   English   中英

实体框架返回多余的不需要的数据

[英]Entity Framework Returning Extra unwanted Data

我在项目中使用实体框架。 .edmx模型文件中有3个表:

具有以下两列的表Category master

* Category_id (int, primary key)
* Category_Name (nvarchar)

还有另外两个表Sub_Category_MasterQuestion_master 两者都有一个FK Category_id ,它链接到category_MasterPK

我的问题是当我访问数据时

dt = context.Category_Master.ToList().ToDataTable();

比它应该只返回Category_Master表中的数据,但我得到的是另外两个列Question_MasterSub_Category_master ,其值类型为System.Collection

在此处输入图片说明

由于这是一个api而导致问题,并且由于不需要的值而失败

尽管我可以通过以下方法解决此问题

dt = context.Category_Master.Select(x => new
            {
                Category_id = x.Category_id,
                Category_Name = x.Category_Name
            }).ToList().ToDataTable();

这仅返回必需的值,但是在将来如果我们需要在表中添加其他列而不是对新列进行调整的情况下,在这种情况下,我不想这样做,也不想在以下情况下使用ado.net: select * from table语句中select * from table 因此,如何像下面的快照一样使用Entity Framework仅获取类别主数据

在此处输入图片说明

更新一个

以下是Category_master.cs的自动生成的Category_master.cs

public partial class Category_Master
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Category_Master()
    {
        this.Question_Master = new HashSet<Question_Master>();
        this.Sub_Category_Master = new HashSet<Sub_Category_Master>();
    }

    public int Category_id { get; set; }
    public string Category_Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Question_Master> Question_Master { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Sub_Category_Master> Sub_Category_Master { get; set; }
}

如果我注释掉其他类似下面的类的virtual ICollection ,那么它将影响我的代码中的某个地方吗? 还是表关系?

 public partial class Category_Master
 {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Category_Master()
        {
            //this.Question_Master = new HashSet<Question_Master>();
            //this.Sub_Category_Master = new HashSet<Sub_Category_Master>();
        }

        public int Category_id { get; set; }
        public string Category_Name { get; set; }

        //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        //public virtual ICollection<Question_Master> Question_Master { get; set; }
        //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        //public virtual ICollection<Sub_Category_Master> Sub_Category_Master { get; set; }
}

而不是返回Entity,而是返回DTO对象:

public class CategoryDTO
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
}

您可以使用AutoMapper将实体映射到DTO类,如下所示:

CreateMap<Category, CategoryDTO>()
    .ForMember(q => q.CategoryName, w => w.MapFrom(e => e.Category_Name))
    .ForMember(q => q.CategoryId, w => w.MapFrom(e => e.Category_Id));

通过使用可查询扩展,您可以通过以下方式查询数据库:

context.Category_Master.ProjectToList<CategoryDTO>();

如果您不想处理AutoMapper和DTO,则可以使用OData

PM>安装包Microsoft.Data.OData

public class CategoryController : ODataController
{
    private readonly YourDbContext _ctx;
    public CategoryController(YourDbContext ctx)
    {
        _ctx = ctx;
    }        

    [EnableQuery]
    public IQueryable<Category_Master> Get()
    {
       return _ctx.Category_Master;
    }
}

要求仅选择Category_ID和Category_Name:

GET / odata / Category?$ select = Category_Name,Category_Id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM