0

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

我正在尝试使用 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工作正常,我得到一个ChildTableParentTableId是“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 实体

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

(感谢您阅读本文!)

4

1 回答 1

2

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

这将导致急切加载。

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

或者您可以通过设置启用延迟加载ctx.ContextOptions.LazyLoadingEnabled = true;

于 2010-06-23T14:40:27.223 回答