1

我有这些实体:

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 Application带有 aDbContext和 a的测试台项目Repository,第二个是完整的生产项目,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));
}
4

1 回答 1

0

它现在正在工作,我不知道为什么..我没有篡改任何东西。我唯一拥有的就是.InTransientScope()穿上IDbContextFactory<MyContext>

实际上,我在所有可能的地方都启用了所有延迟加载,现在它可以工作了....但奇怪的是,当我开始生产项目时,我什至根本没有篡改延迟加载,但自从我扩展Model并添加了modelBuilder我拥有的东西专门告诉它延迟加载。

于 2013-09-07T17:19:22.730 回答