2010-06-23 3 views
0

(Это похоже на длинный вопрос, но это не очень, честно!)Entity Framework Код только Отношения Не читается

Я пытаюсь получить простое доказательство концепции работы с Entity Framework 4, и Версия CTP 3 только для кода. Мне кажется, что я пропускаю что-то действительно очевидное и простое.

я это следующий тест, который не удается:

[TestFixture] 
public class ParentChildTests 
{ 
    [Test] 
    public void ChildRead_DatabaseContainsRelatedObjects_ParentIsNotNull() 
    { 
     var ctx = GetMyObjectContext(); 
     var child = ctx.Children.Where(c => c.Id == 1).Single(); 
     var parent = child.ParentTable; 
     Assert.That(parent, Is.Not.Null); 
    } 

    // GetMyObjectContext etc... 
} 

Считанные из child работает отлично, и я вернусь, значение ChildTable которого ParentTableId является «1», как я хотел бы ожидать, но ParentTable свойство NULL , Я не ожидаю этого, потому что мои POCOs имеют все виртуальные свойства (см. Ниже), а по умолчанию EF4 имеет ленивую загрузку.

Что мне не хватает?


База данных

create table parent_table 
(
    parent_table_id int identity(1,1) primary key, 
    parent_table_name varchar(50) not null, 
    display_name  varchar(50) 
) 

create table child_table 
(
    child_table_id int identity(1,1) primary key, 
    child_table_name varchar(50) not null, 
    parent_table_id int not null 
) 

alter table child_table add constraint FK_child_table__parent_table 
foreign key (parent_table_id) references parent_table(parent_table_id) 

POCO Entities

public class ParentTable 
{ 
    public virtual int Id   { get; set; } 
    public virtual string Name  { get; set; } 
    public virtual string DisplayName { get; set; } 
} 

public class ChildTable 
{ 
    public virtual int   Id   { get; set; } 
    public virtual string  Name   { get; set; } 
    public virtual int   ParentTableId { get; set; } 
    public virtual ParentTable ParentTable { get; set; } 
} 

Entity Конфигурации

public class ParentTableConfiguration : EntityConfiguration<ParentTable> 
{ 
    public ParentTableConfiguration() 
    { 
     MapSingleType(pt => new 
     { 
      parent_table_id = pt.Id, 
      parent_table_name = pt.Name, 
      display_name  = pt.DisplayName, 
     }) 
     .ToTable("dbo.parent_table"); 

     Property(pt => pt.Id ).IsIdentity(); 
     Property(pt => pt.Name).IsRequired(); 
    } 
} 

public class ChildTableConfiguration : EntityConfiguration<ChildTable> 
{ 
    public ChildTableConfiguration() 
    { 
     MapSingleType(ct => new 
     { 
      child_table_id = ct.Id, 
      child_table_name = ct.Name, 
      parent_table_id = ct.ParentTableId, 
     }) 
     .ToTable("dbo.child_table"); 

     Property(ct => ct.Id ).IsIdentity(); 
     Property(ct => ct.Name).IsRequired(); 

     Relationship(ct => ct.ParentTable) 
      .HasConstraint((ct, pt) => ct.ParentTableId == pt.Id); 
    } 
} 

(Спасибо за чтение этого далеко!)

ответ

2

Насколько понимаю, вы просто не загрузить эту свойство навигации.

Это приведет к активной загрузке.

var child = ctx.Children.Include("ParentTable").Where(c => c.Id == 1).Single();

Или вы можете включить отложенную загрузку, установив ctx.ContextOptions.LazyLoadingEnabled = true;

+0

Спасибо, Юрий. Я знал, что это будет что-то простое! –

+0

Добро пожаловать. :) –

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