Я перехожу от отображения EDMX к отображению EF 4.1 DbContext и Fluent, и я хочу отобразить как строковый внешний ключ, так и внешний объект, используя свободный API.У меня есть сотрудник с дополнительным офисом.Я хотел бы, чтобы OfficeId и объект Office в классе Employee (это все только для чтения, и мне не нужно иметь возможность сохранять эти объекты).Объекты с ключами int работают нормально, но я пробовал несколько с использованием строковых ключей и получил тот же результат - поле OfficeId заполняется, но объект Office возвращается как ноль.Проверка в профилировщике SQL данных запрашивается, но объект office не заполняется.
public partial class Employee
{
public int Id { get; set; }
// snip irrelevant properties
public Office Office { get; set; } // this is (incorrectly) always null
public string OfficeId { get; set; }
public WorkGroup WorkGroup { get; set; } // this one with the int key is fine
public int? WorkGroupId { get; set; }
// snip more properties
}
public partial class Office
{
public string Id { get; set; }
public string Description { get; set; }
}
public partial class WorkGroup
{
public int Id { get; set; }
public string Code { get; set; }
}
После обратной связи с Ладиславом ниже я сопоставляю его следующим образом в OnModelCreating
modelBuilder.Entity<Employee>().HasKey(d => d.Id).ToTable("Employee", "ExpertQuery");
modelBuilder.Entity<Office>().HasKey(d => d.Id).ToTable("Office", "ExpertQuery");
modelBuilder.Entity<WorkGroup>().HasKey(d => d.Id).ToTable("WorkGroup", "ExpertQuery");
modelBuilder.Entity<Employee>()
.HasOptional(a => a.Office)
.WithMany()
.Map(x => x.MapKey("OfficeId")); // this one does not work
modelBuilder.Entity<Employee>()
.HasOptional(e => e.WorkGroup)
.WithMany()
.HasForeignKey(e => e.WorkGroupId); // this one works fine
Я предполагаю, что есть некоторые тонкости со строковыми ключами, которые мне не хватает?Я запрашиваю его следующим образом:
var employees = expertEntities.Employees.Include("Office").Include("WorkGroup").Take(10).ToList();
Если я опускаю поле OfficeId в Employee и настраиваю сопоставление следующим образом:
modelBuilder.Entity<Employee>()
.HasOptional(e => e.BusinessEntity)
.WithMany()
.Map(x => x.MapKey("OfficeId"));
Затем заполняется объект office, ноМне нужно поле OfficeId в объекте Employee.