简体   繁体   English

实体框架:延迟加载不起作用

[英]Entity Framework : Lazy Loading Not working

I am getting all the related tables populated (multiple times /circular/loop) even for a simple include of 2 tables query.. 我正在填充所有相关表(多次/ circular / loop),即使只是简单地包含2个表查询。

Here are my DB details. 这是我的数据库详细信息。

public interface IPhaniDbContext
{
        DbSet<Data_CustomerDetail> CustomerDetails { get; set; }
        DbSet<Data_DisplayStyle> DisplayStyles { get; set; }
        DbSet<Data_ResumeDetail> ResumeDetails { get; set; }

        int Save();
        Task<int> SaveChangesAsync();

        Database Database { get; }

        DbEntityEntry Entity(object entity);

        DbSet<TEntity> Set<TEntity>() where TEntity : class;
}

public class PhaniDbContext :DbContext , IPhaniDbContext
{
        public PhaniDbContext() : base(ConnectionString())
        {
            Configuration.LazyLoadingEnabled = false;
        }

        private static string ConnectionString()
        {
            return ConfigurationManager.AppSettings[Constants.Appsetting_PhaniDbConnectionString];
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.AddFromAssembly(Assembly.GetAssembly(GetType()));

            modelBuilder.Entity<Data_CustomerDetail>()
                .HasMany(x => x.ResumeDetails).WithRequired(e => e.CustomerDetail).WillCascadeOnDelete(false);

            //modelBuilder.Entity<Data_CustomerDetail>()
            //    .Map(x => x.Requires("ResumeDetails")).Ignore(e => e.ResumeDetails)
            //    .Map(x => x.Requires("DisplayStyle")).Ignore(e => e.ResumeDetails);

            modelBuilder.Entity<Data_DisplayStyle>()
                .HasMany(x => x.ResumeDetails).WithRequired(e => e.DisplayStyle).WillCascadeOnDelete(false);

        }

        public int Save()
        {
            return  base.SaveChanges();
        }

        public DbEntityEntry Entity(object entity)
        {
            throw new NotImplementedException();
        }

        //TODO: No-Urget-Over ride Save just to know. and all other possible overrides.
        public virtual DbSet<Data_CustomerDetail> CustomerDetails { get; set; }
        public virtual DbSet<Data_DisplayStyle> DisplayStyles { get; set; }
        public virtual DbSet<Data_ResumeDetail> ResumeDetails { get; set; }
}

Query: 查询:

 _phaniDbContext.CustomerDetails
                .Include(x => x.ResumeDetails)
                .Include(x=>x.ResumeDetails.Select(y=>y.DisplayStyle))
                .First(x=>x.CustomerDetailsID == customerId); 

My pocos are here: 我的pocos在这里:

[Table("CustomerDetails")]
public class Data_CustomerDetail
{
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Data_CustomerDetail()
        {
            ResumeDetails = new HashSet<Data_ResumeDetail>();
        }

        [Key]
        public int CustomerDetailsID { get; set; }

        [StringLength(500)]
        public string FirstName { get; set; }

        [StringLength(500)]
        public string LastName { get; set; }

        [StringLength(50)]
        public string phoneNumber { get; set; }

        [StringLength(50)]
        public string Zipcode { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Data_ResumeDetail> ResumeDetails { get; set; }
}

public class Data_DisplayStyle
{
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Data_DisplayStyle()
        {
            ResumeDetails = new HashSet<Data_ResumeDetail>();
        }

        public int DisplayStyleID { get; set; }

        [StringLength(500)]
        public string Name { get; set; }

        [StringLength(500)]
        public string Description { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Data_ResumeDetail> ResumeDetails { get; set; }
}

[Table("ResumeDetails")]
public class Data_ResumeDetail
{
        [Key]
        public int ResumeDetailsId { get; set; }

        [Column("CAREER OBJECTIVE")]
        [StringLength(4000)]
        public string CAREER_OBJECTIVE { get; set; }

        [Column("HONORS AND REWARDS")]
        [StringLength(4000)]
        public string HONORS_AND_REWARDS { get; set; }

        [Column("PROFESSIONAL RESPONSIBILITIES")]
        [StringLength(4000)]
        public string PROFESSIONAL_RESPONSIBILITIES { get; set; }

        [Column("RELATED EXPERIENCE")]
        [StringLength(4000)]
        public string RELATED_EXPERIENCE { get; set; }

        public int? CustomerDetailsID { get; set; }

        public int? DisplayStyleId { get; set; }

        public virtual Data_CustomerDetail CustomerDetail { get; set; }

        public virtual Data_DisplayStyle DisplayStyle { get; set; }
}

Could someone please help me in resolving this... 有人可以帮我解决这个问题吗...

I just want CustomerDetails and ResumeDetails and displaystyle table once... not multiple times.. 我只希望CustomerDetails和ResumeDetails和displaystyle表一次...而不是多次。

This is increasing my object weight 这增加了我的物体重量

When doing a foreign key relationship, you probably need to specify the foreign key(s) 在进行外键关系时,您可能需要指定外键

Example: 例:

modelBuilder
    .Entity<Data_CustomerDetail>()
    .HasMany(x => x.ResumeDetails)
    .WithRequired(e => e.CustomerDetail)
    .HasForeignKey(e => e.CustomerDetailsID)
    .WillCascadeOnDelete(false);

modelBuilder
    .Entity<Data_DisplayStyle>()
    .HasMany(x => x.ResumeDetails)
    .WithRequired(e => e.DisplayStyle)
    .HasForeignKey(e => e.DisplayStyleId)
    .WillCascadeOnDelete(false);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM