插入的导航属性不会加载

时间:2013-11-06 17:54:53

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

我上课了:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

User表中:

Id    Name    
1     Tommy
2     John

我创建了一个对象:

Person P = new Person { Name = "Test", UserId = 1 };

我将Person对象插入数据库:

db.Persons.Add(P);
db.SaveChanges();
var user = P.User;

问题是如果我尝试访问P.User它包含nullP的其他属性已正确填充。

为什么?

3 个答案:

答案 0 :(得分:2)

您应该按如下方式创建Person

Person p = db.Persons.Create();
p.Name = "Test";
p.UserId = 1;

不同之处在于Person现在被创建为动态代理,这意味着它能够延迟加载。一旦将其附加到上下文(db.Persons.Add),您就可以访问相关的User

答案 1 :(得分:0)

您应该将UserId属性标记为外键,如:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ForeignKey("User")]
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

就像那样,实体框架将知道您的UserId属性应该属于User属性。

答案 2 :(得分:0)

我认为您需要为此人执行新查询。实体框架insert查询将仅使用SCOPE_IDENTITY()返回新对象的id,因此不会加载相关对象。如果你这样做会怎么样:

var newPerson = db.Persons.Find(P.Id);
var user = newPerson.User;