EntityFramework lazy loading not working

I am new to EntityFramework 6 and keep working in POCO.

Below is my code

Domain.cs

public abstract class BaseEntity
{
    [Key]
    public long Id { get; set; }
}

public class User : BaseEntity
{
    public long UserRoleId { get; set; }

    public string Name { get; set; }

    public virtual _EntityUserRole UserRole { get; set; }    
}

public class UserRole : BaseEntity
{
    public string Name { get; set; }

    public virtual ICollection<_EntityUser> Users { get; set; }

    public virtual ICollection<_EntityUserPermission> UserPermissions { get; set; }

    internal _EntityUserRole()
    {
        Users = new List<_EntityUser>();
        UserPermissions = new List<_EntityUserPermission>();
    }
}

public class UserPermission : BaseEntity
{
    public string Name { get; set; }

    public virtual ICollection<_EntityUserRole> UserRoles { get; set; }

    internal _EntityUserPermission()
    {
        UserRoles = new List<_EntityUserRole>();
    }
}

      

Mapping.cs

public abstract class BaseEntityMap<T> : EntityTypeConfiguration<T> where T : BaseEntity
{
    public BaseEntityMap()
    {
        ToTable(typeof(T).Name);
        HasKey(a => a.Id);
    }
}

public class UserMap : BaseEntityMap<User>
{
    public UserMap()
        : base()
    {
        HasRequired(x => x.UserRole)
            .WithMany(x => x.Users)
            .HasForeignKey(x => x.UserRoleId);
    }
}

public class UserRoleMap : BaseEntityMap<UserRole>
{
    public UserRoleMap()
        : base()
    {
        HasMany(x => x.UserPermissions)
            .WithMany(x => x.UserRoles)
            .Map(x =>
            {
                x.MapLeftKey("UserRoleId");
                x.MapRightKey("UserPermissionId");
                x.ToTable("_EntityUserRole_UserPermission");
            });
    }
}

public class UserPermissionMap : BaseEntityMap<UserPermission>
{
    public UserPermissionMap()
        : base()
    {
    }
}

      

SqlServerDataContext.cs

internal class SqlServerDataContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public DbSet<UserRole> UserRoles { get; set; }

    public DbSet<UserPermission> UserPermissions { get; set; }

    public SqlServerDataContext()
        : base("Name=MyDB")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserMap());
        modelBuilder.Configurations.Add(new UserRoleMap());
        modelBuilder.Configurations.Add(new UserPermissionMap());

        base.OnModelCreating(modelBuilder);
    }
}

      

Program.cs

    private static void Main()
    {
        using (SqlServerDataContext ctx = new SqlServerDataContext())
        {
            UserRole role = new UserRole();
            role.Name = "Super";

            UserPermission prm1 = new UserPermission();
            prm1.Name = "Delete";
            role.UserPermissions.Add(prm1);

            UserPermission prm2 = new UserPermission();
            prm2.Name = "Add";
            role.UserPermissions.Add(prm2);

            UserPermission prm3 = new UserPermission();
            prm3.Name = "Edit";
            role.UserPermissions.Add(prm3);

            User user = new User();
            user.Name = "User 1";
            user.UserRole = role;

            ctx.Users.Add(user);
            ctx.SaveChanges();
        }

        using (SqlServerDataContext ctx = new SqlServerDataContext())
        {
            var b = ctx.Users.Find(1);
        }
    }

      

Result userretrieve

Just like the print screen, after I insert the entry into User and when I return, UserPermissions is empty. Please help! Thank.

+3


source to share


1 answer


You need SaveChanges()

after adding the models to the collections so that they are stored in the database.

Then you can read from the database what you need.



After that, you need to access that property or use Include (to make it impatient, which is preferable).

private static void Main()
{
    using (SqlServerDataContext ctx = new SqlServerDataContext())
    {
        UserRole role = new UserRole();
        role.Name = "Super";

        UserPermission prm1 = new UserPermission();
        prm1.Name = "Delete";
        role.UserPermissions.Add(prm1);

        UserPermission prm2 = new UserPermission();
        prm2.Name = "Add";
        role.UserPermissions.Add(prm2);

        UserPermission prm3 = new UserPermission();
        prm3.Name = "Edit";
        role.UserPermissions.Add(prm3);

        ctx.SaveChanges();

        User user = new User();
        user.Name = "User 1";
        user.UserRole = role;

        ctx.Users.Add(user);

        ctx.SaveChanges();
    }

    using (SqlServerDataContext ctx = new SqlServerDataContext())
    {
        var b = ctx.Users.Find(1);

        // Method 1
        var roleName = b.UserRole.Name;

        // Method 2
        ctx.Users.Include(x => x.UserRole).Include(x => x.UserRole.UserPermissions).FirstOrDefault(x => x.Id == 1);
    }
}

      

0


source







All Articles