3

首先是一些简短的背景:我有一个使用 Entity Framework v1 的现有 ASP.NET MVC 1 应用程序,它工作得相当好,但因为有 40 个表,所以 .edmx 变得笨拙并且容易与 Visual Studio 2008 设计器一起损坏。我想做的是看看迁移 DAL 以使用 EF4 和 Code-First 是否可行。

最初,我试图模拟简单的父/子关系,但没有走得太远。我有 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 个结果,除此之外它返回一个默认Address对象Client.WorkAddressand Client.HomeAddress

我的猜测是,要么我设置ObjectContext.ContextOptions.LazyLoadingEnabled = true在错误的位置,要么(更有可能)我没有得到Client正确Address的关系。

4

1 回答 1

8

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

于 2010-07-23T13:30:17.503 回答