Не могу понять, почему Entity Framework (4.1, Code First) не материализует необязательное свойство навигации.
POCO которые:
public class PlanMember {
public Int64 Id { get; set; }
public String FirstName { get; set; }
public virtual SystemUser CaseManager { get; set; }
public String LastName { get; set; }
public virtual PlanMemberStatus Status { get; set; }
}
public class SystemUser {
public String EMail { get; set; }
public String FirstName { get; set; }
public String Id { get; set; }
public String LastName { get; set; }
}
public class PlanMemberStatus {
public Int32 Id { get; set; }
public String Code { get; set; }
}
Классы конфигурации:
public class ForPlanMemberEntities:EntityTypeConfiguration<PlanMember> {
public ForPlanMemberEntities(String schemaName) {
this.HasOptional(e => e.CaseManager)
.WithMany()
.Map(m => m.MapKey("CaseManagerID"));
this.HasRequired(e => e.Status)
.WithMany()
.Map(m => m.MapKey("StatusID"));
this.ToTable("PlanMember", schemaName);
}
}
public class ForSystemUserEntities:EntityTypeConfiguration<SystemUser> {
public ForSystemUserEntities(String schemaName) {
this.ToTable("SystemUser", schemaName);
}
}
public class ForPlanMemberStatusEntities:EntityTypeConfiguration<PlanMemberStatus> {
public ForPlanMemberStatusEntities(String schemaName) {
this.ToTable("PlanMemberStatus", schemaName);
}
}
Контекст:
public class Context:DbContext {
public DbSet<PlanMember> PlanMemberDbSet { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
var schemaName = Properties.Settings.Default.SchemaName;
modelBuilder.Configurations
.Add(new Configuration.ForPlanMemberEntities(schemaName))
.Add(new Configuration.ForPlanMemberStatusEntities(schemaName))
.Add(new Configuration.ForSystemUserEntities(schemaName))
;
}
}
На основании этой конфигурации, если я выполню запрос, подобный следующему, он не заполнит свойство CaseManager
. Свойство PlanMemberStatus
загружается просто отлично.
var test = (from member in PlanMemberDbSet
where member.CaseManager != null
select member).First();
var cm = test.CaseManager;
В моем примере cm
всегда null
, несмотря на то, что - по логике - это должно быть невозможно. Есть мысли?
РЕДАКТИРОВАТЬ - Если я сделаю PlanMemberDbSet.Include("CaseManager")
, то это работает, как ожидалось. Почему это необходимо? В других случаях мне не приходилось это делать.