2010-07-23 113 views
3

首先给出一些简要背景:我有一个使用实体框架v1的现有ASP.NET MVC 1应用程序,它工作得很好,不过因为有了40个表格,.edmx使用Visual Studio 2008设计器变得笨拙并容易出现腐败。 我想要做的是看看迁移DAL以使用EF4和Code-First是否可行。实体框架4代码优先定制表映射Fluent API问题

最初我试图建立简单的父母/子女关系,但没有变得很远。我有2个表ClientAddress其对应于以下POCO类:

public class Client 
{ 
    public int ClientId { get; set; } 
    public string Name { get; set; } 
    public Address HomeAddress { get; set; } 
    public Address WorkAddress { get; set; } 
    // More properties here 
} 

public class Address 
{ 
    public int AddressId { get; set; } 
    public string NameOrNumber { get; set; } 
    public string Line1 { get; set; } 
    // More properties here 
} 

另外我有一个DbContext类中,我使用流畅API定义的关系:

public class AppContext : DbContext 
{ 
    public SlobContext() : base() 
    { 
     this.ObjectContext.ContextOptions.LazyLoadingEnabled = true; 
    } 

    public DbSet<Client> Clients 
    { 
     get; 
     set; 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Address>().MapSingleType().ToTable("Address"); 
     modelBuilder.Entity<Client>().HasKey(c => c.ClientID); 
     modelBuilder.Entity<Client>().HasRequired<Address>(c => c.HomeAddress); 
     modelBuilder.Entity<Client>().HasRequired<Address>(c => c.WorkAddress); 

     modelBuilder.Entity<Client>() 
      .MapSingleType(c => new 
      { 
       Name = c.Name, 
       ClientID = c.ClientID, 
       HomeAddressID = c.HomeAddress.AddressID, 
       WorkAddressID = c.WorkAddress.AddressID 
      }) 
      .ToTable("Client"); 
    } 
} 

所以然后在我的控制器我可以返回以下作为我的型号:

Context.Clients.Take(10).OrderBy(i => i.Name) 

它从数据库返回10个结果如预期的那样,除了它返回Client.WorkAddressClient.HomeAddress的默认对象Address

我的猜测是,无论我在错误的地方设置ObjectContext.ContextOptions.LazyLoadingEnabled = true,或(更可能)我没有得到我的ClientAddress之间的关系正确。

回答

8

您的地址属性不是虚拟的。除非属性是虚拟的,否则延迟加载无法在POCO上工作。

+0

Craig。非常感谢 - 是的,您的POCO课程中的所有集合都必须是虚拟的。 – 2010-07-28 15:26:55