Since Entity Framework does not support lazy scalar properties, only lazy references and collections, in order to avoid automatic loading of columns with large contents – BLOBs or CLOBs – we can use a technique called table splitting. In a nutshell, this means using multiple entities to store the columns of a table, say, one for the core, and another for the heavy columns.
Let’s say we have the following class model:
The code might look like this, using mapping attributes:
1: [Table("Core")]
2:publicclass Detail
3: { 4: [Key]5: [ForeignKey("Core")]
6:public Int32 CoreId
7: { 8: get; 9: set; 10: } 11: 12: [Required]13:public Core Core
14: { 15: get; 16: set; 17: } 18: 19:public String HeavyProperty
20: { 21: get; 22: set; 23: } 24: } 25: 26:publicclass Core
27: {28:public Int32 CoreId
29: { 30: get; 31: set; 32: } 33: 34:public Int32 RegularProperty
35: { 36: get; 37: set; 38: } 39: 40: [Required]41:publicvirtual Detail Detail
42: { 43: get; 44: set; 45: } 46: }It can also be configured with fluent mapping:
1:protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder)
2: { 3: modelBuilder.Entity<Core>().HasRequired(p => p.Detail).WithRequiredPrincipal(a => a.Core); 4: modelBuilder.Entity<Detail>().HasRequired(p => p.Core).WithRequiredPrincipal(a => a.Detail);5: modelBuilder.Entity<Detail>().ToTable("Core");
6: 7:base.OnModelCreating(modelBuilder);
8: }You will notice that both properties need to be marked as required, this is a requirement for table splitting in EFCF. The Detail property is naturally lazy loaded and so is the HeavyProperty.