具有EF6子集合的父/子总是为空

时间:2017-02-01 17:03:11

标签: c# sql entity-framework ef-fluent-api

当我通过EF拉取MyList对象时,父关系正确关联,但Children集合始终为null。不知道我做错了什么,几乎每篇文章都表明这样做。

数据库

CREATE TABLE [dbo].[MyList] (
    [MyListId]     BIGINT           IDENTITY (1, 1) NOT NULL,
    [ParentMyListId] BIGINT NULL, 
    CONSTRAINT [PK_MyList] PRIMARY KEY CLUSTERED ([MyListId] ASC) WITH (FILLFACTOR = 90),
    CONSTRAINT [FK_MyList_MyList_MyListId] FOREIGN KEY (ParentMyListId) REFERENCES MyList(MyListId)
);

模型

public class MyList
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long MyListId { get; set; }
    public long? ParentMyListId { get; set; }

    [ForeignKey("ParentMyListId")]
    public virtual List MyListParent { get; set; }

    public virtual ICollection<MyList> MyListChildren { get; set; }
}

的DbContext

public class MyContext : DbContext
{
    public MyContext() : base(Properties.Settings.Default.DbContext)
    {
        Configuration.LazyLoadingEnabled = false;
    }

    public DbSet<MyList> MyLists { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyList>()
        .ToTable("MyList", "dbo")
        .HasOptional(x => x.MyListParent)
        .WithMany(x => x.MyListChildren)
        .HasForeignKey(x => x.ParentMyListId)
        .WillCascadeOnDelete(false);
    }

    base.OnModelCreating(modelBuilder);
}

1 个答案:

答案 0 :(得分:1)

我尝试在EF 6.1.3版本中使用相同的结构,它就像魅力一样。我添加了db中输出和数据的图像。如果在配置中禁用加载,则唯一可能停止工作的事情。我希望它对您有用,请尝试我的示例代码。

  // Your entity class I added name property to show you the results 
   public class MyList
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long MyListId { get; set; }
        public long? ParentMyListId { get; set; }

        public string Name { get; set; }

        [ForeignKey("ParentMyListId")]
        public virtual MyList MyListParent { get; set; }

        public virtual ICollection<MyList> MyListChildren { get; set; }
    }       

     // DBContext please note no configuration properties set just default constructor 
     // you need t check here if you have set soemthing here 
       public class TestContext : DbContext
        {
            public TestContext()
                : base("name=TestConnection")
            {
            }               

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<MyList>()
                .ToTable("MyList", "dbo")
                .HasOptional(x => x.MyListParent)
                .WithMany(x => x.MyListChildren)
                .HasForeignKey(x => x.ParentMyListId)
                .WillCascadeOnDelete(false);

            }

            public virtual DbSet<MyList> Lists { get; set; }
        }

显示结果的控制台应用:

    static void Main(string[] args)
    {
        using (var ctx = new TestContext())
        {

            // for testing to see al working 
            //this is important to read the entity first .
            var parent = ctx.Lists.ToList();

            foreach (var p in parent)
            {
                foreach (var child in p.MyListChildren)
                {
                    Console.WriteLine(string.Format(@"Parent Name {0}  has child with name {1}", p.Name, child.Name));
                }
            }

        }

        Console.ReadLine();
    }

在数据库中输出应用和数据......

enter image description here