2016-07-26 4 views
-1

я столкнулся в странном поведении Npgsql для Entity Framework Core:Entity Framework Ядро становится Внешняя Основные объекты не представляется возможным с Npgsql

Мои модели:

public class Customer 
{ 
    public Customer() 
    { 
     Numbers = new List<TelephoneNumber>(); 
     Emails = new List<Email>(); 
    } 
    public int CustomerId { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 

    public Address Address { get; set; } 

    public List<TelephoneNumber> Numbers {get;set;} 

    public List<Email> Emails { get; set; } 

    public string Note { get; set; } 
} 

public class Address 
{ 
    public int AddressId { get; set; } 
    public string Street { get; set; } 
    public int HouseNumber { get; set; } 

    public int Code { get; set; } 

    public string City { get; set; } 

    public int CustomerId { get; set; } 
    public Customer Customer { get; set; } 
} 

public class Email 
{ 
    public int EmailId { get; set; } 

    public string Address { get; set; } 

    public int CustomerId { get; set; } 
    public Customer Customer { get; set; } 
} 

public class TelephoneNumber 
{ 
    public int TelephoneNumberId { get; set; } 

    public string Number { get; set; } 

    public int CustomerId { get; set; } 
    public Customer Customer { get; set; } 
} 

И мой DbContext:

public class CustomerContext : DbContext 
{ 
    public CustomerContext(DbContextOptions<CustomerContext> options) : base(options) 
    {} 
    public DbSet<Customer> Customers {get; set;} 
    public DbSet<Address> Addresses { get; set; } 

    public DbSet<Email> Emails {get;set;} 
    public DbSet<TelephoneNumber> Numbers {get;set;} 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     builder.Entity<Customer>().HasKey(m => m.CustomerId); 
     builder.Entity<Address>().HasKey(m => m.AddressId); 
     builder.Entity<Email>().HasKey(m => m.EmailId); 
     builder.Entity<TelephoneNumber>().HasKey(m => m.TelephoneNumberId); 

     base.OnModelCreating(builder); 
    } 
} 

Я успешно подключился к базе данных postgresql, и схема была создана с помощью «dotnet ef migrations add initPG» и «обновления сети dotnet ef» без проблем с righ т Внешняя ключ сдерживает-и т.д ..

Тогда я создать клиент:

var created = _context.Customers.Add(cust); 
_context.SaveChanges(); 

С клиентом, содержащим адрес, адрес электронной почты и номер телефона.

Моя проблема, когда я хочу, чтобы все клиенты из БД с:

IEnumerable<Customer> customers = _context.Customers.ToList(); 

я только получите Заказчикам пустой адрес, электронная почта и свойства TelephoneNumber !!

У меня есть логическое недоразумение здесь !? Я бы подумал, что EF-Framework автоматически объединяет таблицу. Или мне нужно вручную самостоятельно получить отдельные элементы от клиента?

В нескольких источниках я вижу включает ключевое слово, чтобы получить ключ на иностранное свойство, но мой IDE показывает, что DbContext не имеет не включает метод на всех!

ответ

2

если вы хотите методы include расширения, типа

using System.Data.Entity; 

Или, если с помощью EF 7, согласно rubiktubik «s предложение

using Microsoft.EntityFrameworkCore 

в верхней части файла

в этот момент вы должны быть в состоянии сделать

IEnumerable<Customer> customers = _context.Customers 
    .Include(c => c.Emails) 
    .ToList(); 
+0

Нужно ли в ef использовать include для получения всех свойств внешнего ключа? – rubiktubik

+0

@ rubiktubik Я, кажется, помню, что есть способ настроить это поведение, но это снизит производительность. Если вы должны знать, [поиск в google нашел меня на этот вопрос] (http://stackoverflow.com/questions/2967214/disable-lazy-loading-by-default-in-entity-framework-4) –

+0

кажется, что ленивая загрузка еще не реализована в ef7, так что должен использоваться метод include – rubiktubik