仅实体框架代码关系未被读取

时间:2010-06-23 13:55:12

标签: entity-framework entity-framework-4 poco code-first

(这看起来像一个很长的问题,但它不是真的,诚实!)

我正在尝试使用Entity Framework 4和Code Only的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,但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) 属性为NULL。我不希望这是因为我的POCO具有所有虚拟属性(见下文),EF4默认启用了延迟加载。

我错过了什么?


数据库

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

POCO实体

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

(感谢您阅读此内容!)

1 个答案:

答案 0 :(得分:2)

据了解,您只是不加载此导航属性。

这将导致急切加载。

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

或者您可以通过设置ctx.ContextOptions.LazyLoadingEnabled = true;

来启用延迟加载