【发布时间】: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