如何使用包含操作来分解数据库?

时间:2015-08-22 18:55:35

标签: asp.net-mvc entity-framework

我有2张桌子

class Table1 { }

class Table2 
{
  ...
  IEnumerable<Table1> Table1s { get; set; }
}

链接

class Table1To2
{
  int Table1Id { get; set; }
  int Table2Id { get; set; }
}

如何使用Table2 Include自动加载Table1s属性?
UPD
在尝试时

db.Table2s.Include(d => d.Table1s);

我有例外 指定的包含路径无效。 EntityType 'Models.Table2'未声明名为'Table1s'的导航属性。

1 个答案:

答案 0 :(得分:0)

EF代码首先不会为定义为IEnumerable的导航属性生成外键,并且流畅的API不支持HasMany。 您需要使用ICollection,我找不到它的MSDN文档,但是对于延迟加载导航,有文档:

表格MSDN

  

表示关系“很多”结尾的导航属性必须返回一个实现ICollection的类型,其中T是关系另一端的对象类型。

我测试了这两个类:

public class Table1
{
    public int Id { get; set; }
    public IEnumerable<Table2> Table2s { get; set; }
}
public class Table2
{
    public int Id { get; set; }
    public string Name { get; set; }
}

以下是迁移中使用的表格(使用EF 6):

        CreateTable(
            "dbo.Table1",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.Table2",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(),
                })
            .PrimaryKey(t => t.Id);

将[{1}}替换为IEnumerable生成后:

Icollection