1

私が思うものを手に入れることはEFの奇妙な振る舞いであり、誰かが光を当てることができることを望んでいます。基本的に、外部キーを使用してアイテムを取得すると、外部キーアイテムは取得されませんか?これは少し短所のようです。明らかなことを見逃したことがありますか、それともこれに対処するためのパターンがありますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace EFTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new MCInitializer());

            EFTestEM context = new EFTestEM();
            var foos = from m in context.Foo
                    select m;

            foreach (var foo in foos)
            {
                // foo.MyBar is null?! How do I populate it?
                Console.WriteLine("{0},{1}",foo.Desc,foo.MyBar.Whatever);
            }

        }

    }


    [Table("tbl_Bar")]
    public class Bar
    {
        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int BarId { get; set; }
        public string Whatever { get; set; }
        public string Whenever { get; set; }
    }


    [Table("tbl_Foo")]
    public class Foo
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int FooId { get; set; }
        public string Desc { get; set; }
        public int MyBarId { get; set; }
        [ForeignKey("MyBarId")]
        public Bar MyBar { get; set; }

    }

    public class MCInitializer : DropCreateDatabaseAlways<EFTestEM>
    {
        protected override void Seed(EFTestEM context)
        {
            List<Bar> bars = new List<Bar>
                             {
                                 new Bar(){Whatever = "Bar1"},
                                 new Bar(){Whatever = "Bar2"},
                                 new Bar(){Whatever = "Bar3"},
                             };


            List<Foo> foos = new List<Foo>
                             {
                                 new Foo() {Desc = "Foo1", MyBar = bars[0]},
                                 new Foo() {Desc = "Foo2", MyBar = bars[1]},
                                 new Foo() {Desc = "Foo3", MyBar = bars[2]}
                             };

            foreach (var bar in bars)
                context.Bar.Add(bar);
            foreach (var foo in foos)
                context.Foo.Add(foo);

            context.SaveChanges();

            base.Seed(context);

        }
    }
}
4

2 に答える 2

2

遅延読み込みの場合は、関連するプロパティを仮想化する必要があります。

例えば

public virtual Bar MyBar { get; set; }
于 2012-11-15T16:46:11.683 に答える
0

関連するプロパティは、「積極的に読み込まれる」または「遅延読み込みされる」必要があります(Charlinoの回答を参照)。

熱心にロードするには、コードで「インクルード」拡張機能を使用する必要があります。

        var foos = from m in context.Foo.Include("MyBar")
                select m;
于 2012-11-15T20:26:29.830 に答える