代码之家  ›  专栏  ›  技术社区  ›  Damian Powell

未读取实体框架纯代码关系

  •  0
  • Damian Powell  · 技术社区  · 14 年前

    我试图得到一个简单的概念证明与实体框架4和ctp3版本的代码只工作。感觉我错过了一些非常明显和简单的东西。

    我的以下测试失败了:

    [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 属性为空。我并不期望这样,因为我的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)
    

    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 回复  |  直到 14 年前
        1
  •  2
  •   Yury Tarabanko    14 年前

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

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