C# EF代码优先-使用外键选择

C# EF代码优先-使用外键选择,c#,entity-framework-4,ef-code-first,C#,Entity Framework 4,Ef Code First,在EF中获得我认为是一种奇怪的行为,我希望有人能对此有所了解。基本上,如果我用外键检索一个项目,外键项目就不会被检索?这似乎有点短。我是否错过了一些明显的东西,或者有一个模式来处理这个问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; namespace EFTest { class Program {

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

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Data.Entity;
命名空间EFTest
{
班级计划
{
静态void Main(字符串[]参数)
{
SetInitializer(新的MCInitializer());
EFTestEM context=新的EFTestEM();
var foos=来自context.Foo中的m
选择m;
foreach(foos中的var foo)
{
//foo.MyBar为空?!如何填充它?
WriteLine(“{0},{1}”,foo.Desc,foo.MyBar.Whatever);
}
}
}
[表(“待定条”)]
公共类酒吧
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共int BarId{get;set;}
公共字符串{get;set;}
每当{get;set;}时的公共字符串
}
[表(“tbl_Foo”)]
公开课Foo
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共int FooId{get;set;}
公共字符串Desc{get;set;}
公共int MyBarId{get;set;}
[外键(“MyBarId”)]
公共栏MyBar{get;set;}
}
公共类MCInitializer:DropCreateDatabaseAlways
{
受保护的覆盖无效种子(EFTestEM上下文)
{
列表栏=新列表
{
新建条(){Whatever=“Bar1”},
新建条(){Whatever=“Bar2”},
新建条(){Whatever=“Bar3”},
};
List foos=新列表
{
新建Foo(){Desc=“Foo1”,MyBar=bar[0]},
新的Foo(){Desc=“Foo2”,MyBar=bar[1]},
新建Foo(){Desc=“Foo3”,MyBar=bar[2]}
};
foreach(以条为单位的变量条)
context.Bar.Add(Bar);
foreach(foos中的var foo)
context.Foo.Add(Foo);
SaveChanges();
种子(上下文);
}
}
}

对于延迟加载,您需要将相关属性虚拟化

例如


相关属性需要“急切加载”或“惰性加载”(参见Charlino的回答)

要快速加载,代码需要使用“Include”扩展名:

        var foos = from m in context.Foo.Include("MyBar")
                select m;
        var foos = from m in context.Foo.Include("MyBar")
                select m;