实体框架代码首先不保存后延迟加载

VAR*_*RAK 5 .net c# lazy-loading entity-framework-4 ef-code-first

我的数据库中有一个查找表和一个数据表.我将以性别和人为例.所以,让我们说性别表看起来像这样:

Id         Code
1          Male
2          Female
Run Code Online (Sandbox Code Playgroud)

而person表看起来像这样:

Id         Name             GenderId
1          Bob              1
2          Jane             2
Run Code Online (Sandbox Code Playgroud)

我首先在EF代码中为这两个表建模,如下所示:

public class Gender
{
    public int Id {get;set;}
    public string Code {get;set;}
}

public class Person
{
    public int Id {get;set;}
    public string Name {get;set;}
    public int GenderId {get;set;}

    public virtual Gender {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

如果我读了一个已经在数据库中的人,那么我可以访问person.Gender.Code没有问题.如果我这样做:

var person = new Person
             {
                 Name = "Bob",
                 GenderId = 1,
             };

context.People.Add(person);
context.SaveChanges();

var code = person.Gender.Code;
Run Code Online (Sandbox Code Playgroud)

然后它会正确保存但在最后一行会失败,因为性别为空.如果我然后打开一个新的上下文并加载保存的实体,那么最后一行工作正常.是否有一种方法可以在保存后直接访问性别,就好像我刚从数据库加载实体一样?

nem*_*esv 8

您的问题是,当您使用new Person()它时,只会创建一个POCO对象,该对象不知道如何获取它的Gender属性.因此,要使延迟加载工作,您需要代理.

您可以使用DbSet.Create()将您的人员创建为代理:

var person = context.People.Create();
person.Name = "Bob";
person.GenderId = 1;

context.People.Add(person);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)