2012-04-28 3 views
2

Это первый раз, когда я делаю проект на C# с Entity Framework 4.3.1. У меня возникают проблемы с получением всех данных из таблицы турниров, адрес, чтобы быть точным.Entity Framework 4.3.1 Код Первое отношение не работает при получении данных

Прежде всего, вот мой код Первый код. Когда я запускаю это, 2 таблицы создаются правильно с правильным соотношением. У меня есть намного больше столбцов, определенных в этих классах, но для этого примера я показываю только несколько.

public class EFDbContext : DbContext 
{ 
    public EFDbContext() 
     : base("ApplicationServices") 
    { 
    } 

    public DbSet<Tournament> tournaments { get; set; } 
    public DbSet<Address> addresses { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 

    public class Tournament 
    { 
     [ScaffoldColumn(false)] 
     public int TournamentId { get; set; } 


     [Required(ErrorMessage="Tournament name is a required field")] 
     public string Name { get; set; } 


     [Required(ErrorMessage="Address is a required field")] 
     public Address Address { get; set; } 
    } 

    public class Address 
    { 
     [ScaffoldColumn(false)] 
     public int AddressId { get; set; } 


     [Required(ErrorMessage="Street name is a required field")] 
     public string Street { get; set; } 


     [Required(ErrorMessage="House number is a required field")] 
     public string HouseNo { get; set; } 
    } 
} 

Когда я ввожу новый турнир с адресом, и я иду проверить в базе данных, если соотношение используется, я могу видеть, что это сработало. Турнир имеет значение Address_AddressId, указывающее на новый вставленный адрес. Но когда я пытаюсь получить информацию, делая это:

Tournament tournament = context.tournaments.Find(id); 

и отладить ее, я могу видеть все данные из турнира в объекте турнира, за исключением адреса. Это значение равно null, и я не знаю, почему.

Можете ли вы, ребята, помочь мне?

Спасибо заранее, Bart

ответ

3

Вы должны получить знакомый немного, как вы можете загрузить данные, связанные с Entity Framework. Введение здесь: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx Это действительно основы, которые необходимо знать для эффективной работы с Entity Framework.

Ожидаемое поведение. Entity Framework не загружает свойство навигации - например, Tournament.Address - автоматически, когда вы просто загружаете родительский объект TournamentFind в вашем примере).

Есть три основных варианта для загрузки данных о системе:

  • жадная загрузка:

    Tournament tournament = context.tournaments 
        .Include(t => t.Address) // <- "eager loading" 
        .SingleOrDefault(t => t.TournamentId == id); 
    

    турнира и адрес будет мы загружены в один туда и обратно и базы данных запроса.

  • Ленивая загрузка: Отметьте свойство навигации в virtual:

    public virtual Address Address { get; set; } 
    

    EF будет динамически создать прокси-объект (производный от Tournament) при загрузке турнира, который способен загрузить соответствующий объект, как только доступ один из его свойств:

    Tournament tournament = context.tournaments.Find(id); 
    string street = tournament.Address.Street; // second query to DB happens here 
    
  • Явная загрузка:

    Tournament tournament = context.tournaments.Find(id); 
    context.Entry(tournament).Reference(t => t.Address).Load(); 
    // second query to DB happens here 
    

    Это похоже на ленивую загрузку, потому что вам также нужны два запроса и обратные вызовы в базу данных, но вы явно контролируете загрузку Address. Явная загрузка имеет возможность фильтровать или сортировать связанные данные (в случае коллекций навигации), которые отсутствуют у других двух параметров.

+0

Спасибо, это было действительно полезно. Я использовал метод загрузки Eager. – Bart

 Смежные вопросы

  • Нет связанных вопросов^_^