[英]Entity Framework Returning Extra unwanted Data
我在项目中使用实体框架。 .edmx
模型文件中有3个表:
具有以下两列的表Category master
:
* Category_id (int, primary key)
* Category_Name (nvarchar)
还有另外两个表Sub_Category_Master
和Question_master
。 两者都有一个FK Category_id
,它链接到category_Master
的PK 。
我的问题是当我访问数据时
dt = context.Category_Master.ToList().ToDataTable();
比它应该只返回Category_Master
表中的数据,但我得到的是另外两个列Question_Master
和Sub_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.