EF 6 - 一对多映射始终为空

LmC*_*LmC 7 c# asp.net-mvc entity-framework one-to-many

我似乎无法解决我的映射问题; 关系是一个用户可能有很多场地,场地必须有一个用户.

我的venue班级看起来像:

public class Venue : BaseObject, IBaseObject
{
    [Required]
    public virtual User Owner { get; set; }

    [Required]
    [MaxLength(50)]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的User班级看起来像:

public class User : BaseObject, IBaseObject
{

    [Required]
    public string Name { get; set; }

    [Required]
    [DisplayName("Email")]
    public string EmailAddress { get; set; }

    [Required]
    public string Password { get; set; }

    public bool Active { get; set; }


    public virtual ICollection<Venue> Venues { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

DbContextClass按要求

 public class SystemContext : DbContext, IDbContext
{
    public SystemContext() :
        base("SystemContext")
    {
        Database.SetInitializer<SystemContext>(null);
        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = true;
    }


    public SystemContext(string connectionstringname = "SystemContext") :
        base(connectionstringname)
    {
        Database.SetInitializer<SystemContext>(null);
        Configuration.ProxyCreationEnabled = false;


    }
    public new IDbSet<T> Set<T>() where T : class
    {
        return base.Set<T>();
    }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<User>().HasMany(x=>x.Venues);
    }



    public DbSet<PublicQueries> PublicQueries { get; set; }
    public DbSet<Venue> Venues { get; set; }
    public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我User从数据库加载类Venues似乎总是为空?

我以前做过类似的事,但不记得我是如何重新安排的.

谢谢

ana*_*der 10

很确定这是一个懒惰的问题.如果你加载一个带有导航属性的对象,ICollection<Venues>那么默认情况下它们就不会被包含,因为它们可能有更多的导航属性链接到更多的对象,这些对象可能有更多的导航属性......在你知道之前你就是加载一半的数据库.当您在访问该导航属性时已经处理了对象出现的上下文时,这是一个特殊问题,因为它没有数据库连接来加载它们,即使它确实意识到它应该这样做.

修复方法是告诉实体框架您希望填充该属性,方法是.Include(u => u.Venues);在从中获取属性时添加DbSet.你需要包含System.Data.Entity以获得特定的重载Include().

  • 不,这不是一个懒惰的问题.如果他将该属性标记为虚拟属性,则会正常延迟加载.不包括在内. (3认同)