EntityFramework未加载相关数据

时间:2013-09-07 16:50:50

标签: c# asp.net-mvc entity-framework

我有这些实体:

public class Company : PrimaryKey
{
    public string Name {get;set;}

    public virtual Account Account {get;set;}
}

public class Account
{
    [Key]
    public Guid CompanyId { get; set; }

    public virtual Company Company {get;set;}
}

我使用这些配置:

modelBuilder.Entity<Company>()
    .HasOptional(c => c.Account)
    .WithRequired(a => a.Company)
    .WillCascadeOnDelete();

现在,我有两个项目,一个是测试平台项目,Console ApplicationDbContextRepository,第二个是完整的生产项目, MVC 4我使用Dependancy Injection创建了一个存储库.InTransientScope(),每次调用时都会加载一个新的上下文。

两者都具有完全相同的上下文和存储库(该产品显然具有接口)。

当我打电话给他时,在测试台上

_repository.GetById<Company>(id);

填写所有属性,即急切加载

在生产中,当我调用相同的行时,没有加载任何内容并且在我创建另一个函数之前它没有加载:

_dbContext.Companies.Include("Account").FirstOrDefault(x => x.Id.Equals(id));

其中,执行时确实提供了所有Account信息,但有趣地禁止Account包含的任何其他导航属性!即使我已禁用LazyLoading,它仍然无法正常工作。

这是令人惊讶的,因为两个项目基本相同,禁止在其中一个项目中使用IoC DI ....

为什么会这样?如何在主要通用的存储库中指定以Controllers首选项来急切加载所有这些信息??

断点

我在两个项目中都设置了断点,看看ADO.NET对数据库的调用和执行的sql语句,在测试工作台中它确实关闭并调用了信息,在生产中它没有显示任何加入或任何这种性质的东西。

尝试其他事项

我在从数据库加载时尝试直接访问导航属性:

var acc = _repository.GetById<Company>(id).Account;

仍然说null。因此,我的存储库/上下文在被要求时甚至没有加载任何相关数据....发生了什么?!

解释

_repository.GetById<Company>(id);

是:

public T GetById<T>(Guid id)
{
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id.Equals(id));
}

1 个答案:

答案 0 :(得分:0)

它现在正在工作,我不知道为什么......我没有被任何东西篡改过。我唯一要做的就是将.InTransientScope()放到IDbContextFactory<MyContext>

我实际上尽可能地启用了所有Lazy Loading,它现在可以正常工作....但是当我开始生产项目时,我甚至从未篡改过Lazy Loading,但是很奇怪Model并添加了modelBuilder我不得不专门告诉Lazy Load。