我在实体框架中获取数据表,但是当我使用Dbcontext.Classname
时,它将为我提供从联接表到该表的所有属性。
但是,我只想获取此表的原始属性。我该怎么办?
答案 0 :(得分:0)
您要只加载当前实体中的字段吗?
您需要在DbContext
中禁用lazy-loading。可以通过在LazyLoadingEnabled
构造函数中将DbContext
设置为false来解决此问题:
public partial class SampleContext : DbContext
{
public SampleContext (): base(...)
{
// disable lazy-loading in your db-context
Configuration.LazyLoadingEnabled = false;
}
}
然后,每当您运行查询时,它仅查询与所选DbSet
相关的字段。例如,假设我们有一个City
和Country
实体。
城市表
CityId | Name | CountryId
-------------------------
1 | Tehran | 98
国家/地区表
CountryId | Name | Culture
-------------------------
98 | Iran | fa-IR
它们的实体模型如下:
public class Country
{
public int CountryId{get;set;}
pulic string Name{get;set;}
public string Culture{get;set;}
}
public class City
{
public int CityId{get;set;}
public string Name{get;set;}
public Country Country{get;set;}
}
我们要选择一个ID为1的城市。
using(var dbContext = new SampleDbContext())
{
var city = dbContext.Cities.SingleOrDefault(c => c.CityId == 1);
var country = city.Country;
// country will be null
// because EF didn't fetch its data, because it's an eager-load
}
上面的查询生成查询,例如:
SELECT * FROM Cities WHERE CityId = 1
并且正如我在上面的代码注释中所提到的,City.Country
将由于使用eager-loading
而为空。在这种情况下,可以使用Include
方法加载导航属性。
using(var dbContext = new SampleDbContext())
{
var city = dbContext.Cities
.Include(c => c.Country)
.SingleOrDefault(c => c.CityId == 1);
}
查询将生成SQL:
SELECT * FROM Cities ci
INNER JOIN Countries c ON ci.CountryId = c.CountryId
除了积极加载外,别忘了您总是可以在查询中使用投影。例如,在我们的示例中,我们只需要获取CityName和CountryName:
using(var dbContext = new SampleDbContext())
{
var cities=dbContext.Cities
.Include(c => c.Country)
.Select(new {CityName=c.Name, CountryName=c.Country.Name}
.ToList();
}
这只会选择两列:
SELECT
ci.Name as CityName,
c.Name as CountryName
FROM
Cities ci
INNER JOIN Countries c
ON ci.CountryId = c.CountryId
希望我能很好地向您描述。