2

我有一个具有虚拟属性 ( public virtual List<Ingredients>) 的类,但在某些情况下我不想获取该数据。我怎样才能做到这一点?我知道.Includeand .Select,但如果我这样做,我需要在我的存储库中更改大量代码,因为我也返回一个 Queryable 和 Service 层。

4

3 回答 3

5

间接回答:我不会IQueryable在服务层中公开。出于(至少)三个原因:

  • 当访问导航属性时,您必须保持上下文处于活动状态。
  • 使用您的服务层的层可以深刻地影响发送到数据库的 SQL。您希望控制您的服务或存储库中的内容。
  • 对服务层进行单元测试非常困难。

因此,如果您在应用程序中公开您需要IEnumerable对象,您可以提供具有在特定场景中所需的完全加载的导航属性的对象。例如,产品实体(名称等)的维护功能将只获得裸产品(并且没有代码会访问成分)。从成分中组合产品的函数也将获取其成分。服务/存储库方法应该有参数来指定你需要什么。

如果你想 100% 保证惰性导航属性不会被访问,你需要将投影对象(或 DTO)暴露给你的应用程序。

于 2012-05-19T11:13:17.500 回答
0

默认情况下不返回相关属性,您需要使用 Include() 来指定返回相关属性。
这可能并不总是很清楚,因为如果您使用延迟加载您不需要显式请求相关属性,EF 将在请求时确定是否需要相关属性并将其添加到数据库请求中。

为了测试这一点,当您通过附加 .First() 声明它时强制执行 LINQ 查询,并查看返回的对象,该对象应该没有相关属性。

编辑 无法从相关属性中仅加载某些属性。如果您加载相关属性,其所有属性都将自动加载。

于 2012-05-18T14:10:39.357 回答
0

您不能简单地构建一个类 SubClass(从 SomeCompany 继承)并包含您需要的属性,这些属性不应包含在您的代理类 (SomeCompany) 中。

例如一个类

某公司

public class SomeCompany
{
    public virtual string SomeProperty { get; set; }
    public virtual Company MyCompany { get; set; }
}

public class SomeCompanyEx : SomeCompany
{
    public string CompanyName { get; set; }

    public override Company MyCompany
    {
        get
        {
            return this.myCompany;
        }

        set
        {
            this.SetProperty(ref this.myCompany, value);

            if (value != null)
            {
                this.CompanyName = value.Name;
            }
            else
            {
                this.CompanyName = null;
            }
        }
    }
}

SomeCompanyEx 类您可以使用,例如,在列表对象等中......所以您现在拥有可以在程序中使用的属性 CompanyName,但在您的代理类中没有。

于 2014-03-12T09:20:05.283 回答