6

LazyLoadingEnabled 专门设置为 true 以防止相关实体在我正在使用的上下文中加载。

药物类别中有一个药物身份对象列表。

public class Drug
{
   public virtual List<DrugIdentity> DrugIdentities { get; set; }
}

如果我想包含要加载的相关实体,则该类的特定配置会设置键和 hasmany 关系。

public DrugConfiguration()
    {
        this.HasKey(d => d.DrugID);
        this.HasMany(d => d.DrugIdentities).WithOptional(d => d.Drug).Map(d => d.MapKey("DrugID"));
    }

当使用 linq 查询加载 Drug 上下文时,对象显示它包含相关的 DrugIdentities,而它不应该包含相关的 DrugIdentities。

context.Configuration.LazyLoadingEnabled = true;

                    var drugs = from d in context.Drug
                                where d.Active == true
                                select d;

药物[0].DrugIdentities 计数 = 1

我希望drugs[0].DrugIdentities 等于NULL,因为延迟加载设置为true?

4

3 回答 3

2

要禁用延迟加载,请将 LazyLoadingEnabled 设置为 false 而不是 true。请参阅相关数据的延迟、急切和显式加载

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-应用

于 2012-05-18T02:42:53.480 回答
1

ProxyCreationEnabled = false如果要设置,则必须专门设置LazyLoadingEnabled = true

测试通过了我的预期。第一个查询返回Drugs对象和NULLfor DrugEntities。第二个查询返回 ,DrugEntities因为我使用Include来进行急切加载。

var queryDrug = from d in context.Drug
                                where d.Active == true
                                select d;

                var drugresults = from d in context.Drug.Include(e => e.DrugIdentities)
                                  where d.Active == true
                                  select d;
于 2012-05-18T17:40:39.253 回答
0

这是延迟加载的行为。如果你只是使用药物的属性,那么不会有任何sql来查询DrugIdentities。如果您使用 DrugIdentities 甚至只是在调试窗口中观看它,那么将有 sql 来查询 DrugIdentities 并且每个药物都有一个 DrugIdentities 搜索查询。您可以通过查看 SQL Profiler 捕获的 sql 来证明该行为。如果您希望 DrugIdentities 在查询药物时为空,您可以通过删除 DrugIdentities 之前的虚拟关键字来更改模型。然后,当您查询药物时,DrugIdentities 将保持为空,直到您通过另一个查询将 DrugIdentities 加载到上下文中。

于 2018-05-14T02:59:05.563 回答