0

(これは長い質問のように見えますが、実際には正直ではありません!)

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

の読み取りは正常に機能し、予想どおり値が「1」のchildaChildTableが返されますが、プロパティは NULL です。私の POCO にはすべての仮想プロパティ (以下を参照) があり、EF4 にはデフォルトで遅延読み込みが有効になっているため、これは予期していません。ParentTableIdParentTable

私は何が欠けていますか?


データベース

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 に答える