Entity Framework 4 Code First Пользовательское сопоставление таблиц Проблема Fluent API - PullRequest
3 голосов
/ 23 июля 2010

Сначала краткий обзор: у меня есть существующее приложение ASP.NET MVC 1, использующее Entity Framework v1, которое работает довольно хорошо, хотя из-за того, что имеется 40 таблиц, .edmx становится громоздким и склонным к повреждениям в Visual Studio 2008 дизайнер. Что я хочу сделать, это посмотреть, возможно ли перенести DAL для использования EF4 и Code-First.

Изначально я пытаюсь смоделировать простые отношения между родителями и детьми, но не очень далеко. У меня есть 2 таблицы Client и Address, которые соответствуют следующим классам 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.WorkAddress и Client.HomeAddress.

Я предполагаю, что либо я устанавливаю ObjectContext.ContextOptions.LazyLoadingEnabled = true в неправильном месте, либо (что более вероятно), я не получаю правильные отношения между Client и Address.

1 Ответ

8 голосов
/ 23 июля 2010

Свойства вашего адреса не являются виртуальными. Ленивая загрузка не может работать в POCO, если свойства не являются виртуальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...