Не читаются отношения только с кодом Entity Framework - PullRequest
0 голосов
/ 23 июня 2010

(Это выглядит как длинный вопрос, но это не совсем, честно!)

Я пытаюсь получить простое подтверждение концепции работы с 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.Я не ожидаю этого, потому что мои POCO имеют все виртуальные свойства (см. Ниже), а в 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; }
}

Конфигурации сущностей

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);
    }
}

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

1 Ответ

2 голосов
/ 23 июня 2010

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

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

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

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

...