如何获取数据表的原始属性?

时间:2019-07-05 14:02:08

标签: c# entity-framework

我在实体框架中获取数据表,但是当我使用Dbcontext.Classname时,它将为我提供从联接表到该表的所有属性。
但是,我只想获取此表的原始属性。我该怎么办?

1 个答案:

答案 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相关的字段。例如,假设我们有一个CityCountry实体。

城市表

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

希望我能很好地向您描述。