我在我的项目中使用Entity Framework。 .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带有select * from table
语句的.net。那么我如何才能使用Entity Framework获取类别master的数据,如下面的快照
更新
以下是自动生成的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; }
}
答案 0 :(得分:1)
不是返回实体,而是返回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));
利用Queryable Extensions,您可以通过以下方式查询数据库:
context.Category_Master.ProjectToList<CategoryDTO>();
答案 1 :(得分:1)
如果您不想处理AutoMapper和DTO,可以使用OData:
PM&GT;安装包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