繁体   English   中英

具有EF6子集合的父/子始终为null

[英]Parent/Child with EF6 child collection always null

每当我通过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; }
}

数据库上下文

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

我在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();
    }

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM