2011-09-25 125 views
0

我正在从一个EDMX映射到EF 4.1 DbContext和Fluent映射,我想映射一个字符串外键和外国对象使用流利的API。我有一个雇员与一个可选的办公室。我想要Employee类中的OfficeId和Office对象(这是全部只读的,我不需要能够保存这些对象)。具有int键的对象工作正常,但我已经尝试了几个字符串键并获得相同的结果 - OfficeId字段填充,但Office对象返回为空。在SQL分析器中查找数据正在被查询,但Office对象没有被填充。实体框架4.1 Fluent映射外键和外键对象与字符串键

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现场,并成立了这样的映射:

modelBuilder.Entity<Employee>() 
    .HasOptional(e => e.BusinessEntity) 
    .WithMany() 
    .Map(x => x.MapKey("OfficeId")); 

然后Office对象被填充,但我需要的OfficeId Employee对象中的字段。

回答

1

好吧,我发现这个问题 - 这是一个数据问题 - 主键字符串值被填充空格,并且外键值不是(!)。虽然SQL正确地加入表(忽略填充)并提取正确的数据,但似乎EF不会将它关联回正确的对象,因为.NET比关于尾随空白的SQL更加繁琐。

0

由于您已经引入了字符串类型的OfficeId属性,因此您的自定义映射只是冲突。看看如果从Employee定义中删除OfficeId属性或将其更改为int类型会发生什么情况。

+0

谢谢,这帮助我进一步细化 - int键工作正常,但字符串键似乎不起作用。我添加了几个检查,并且int键很好,并且字符串键总是产生一个空对象 – MarkGr

0

这是不正确的映射。如果您拥有FK酒店,则不能使用MapMapKey。这是针对您没有该属性的场景。试试这个:

modelBuilder.Entity<Employee>() 
      .HasOptional(a => a.Office) 
      .WithMany() 
      .HasForeignKey(a => a.OfficeId); 

另外,映射实体到表的映射的第一部分很可能是不正确的。 Map用于继承和实体拆分方案。您正在寻找ToTable

modelBuilder.Entity<Employee>().HasKey(d => d.Id).ToTable("ExpertQuery.Employee"); 

此外,如果你的ExpertQuery是数据库模式,而不是表名的一部分,它应该看起来像:

modelBuilder.Entity<Employee>().HasKey(d => d.Id).ToTable("Employee", "ExpertQuery"); 
+0

谢谢,我按照您的建议更正了映射。这些对象位于模式中,遗憾的是我的问题仍然存在 - 如果我将映射更改为.HasForeignKey,则会填充OfficeId字段,但Office对象返回为空(我做了。包括它)。如果我删除了OfficeId字段,则.Map表示法可以正常工作,然后我可以获取Office对象。我发现我必须执行.Map,因为密钥在数据库中被命名为OfficeId而不是Office_Id – MarkGr