【问题标题】:Entity Framework : Lazy Loading Not working实体框架:延迟加载不起作用
【发布时间】:2018-11-01 05:24:59
【问题描述】:

即使对于包含 2 个表的简单查询,我也会填充所有相关表(多次/循环/循环)..

这是我的数据库详细信息。

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; }
}

查询:

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

我的 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; }
}

有人可以帮我解决这个问题吗...

我只想要 CustomerDetails 和 ResumeDetails 和 displaystyle 表一次...而不是多次..

这增加了我的物体重量

【问题讨论】:

  • 您想知道为什么延迟加载不起作用,但您添加了Configuration.LazyLoadingEnabled = false;
  • 感谢您的回复。甚至 Configuration.LazyLoadingEnabled = True 也以相同的方式加载..
  • 您从未使用过.HasForeignKey(...)ForeignKey 属性来告诉EF 如何关联所需的实体。另见:stackoverflow.com/questions/19920412/…
  • 我只是将所有由代码生成的关系首先用于现有的数据库模板。另外,我尝试了 HasForeignKey,但出现错误:请您帮我制定它们。

标签: c# .net entity-framework lazy-loading


【解决方案1】:

在建立外键关系时,您可能需要指定外键

例子:

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);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多