Я перехожу от сопоставления EDMX к сопоставлению DbContext и Fluent EF 4.1, и я хочу сопоставить как внешний ключ строки, так и внешний объект, используя свободный API. У меня есть сотрудник с дополнительным офисом. Я хотел бы иметь как OfficeId, так и объект Office в классе Employee (все это доступно только для чтения, и мне не нужно сохранять эти объекты). Объекты с ключами int работают нормально, но я попробовал несколько со строковыми ключами и получил тот же результат — поле OfficeId заполняется, но объект Office возвращается как null. Проверка в профилировщике SQL: данные запрашиваются, но офисный объект не заполняется.
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.