我上课了:
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
它包含null
。 P
的其他属性已正确填充。
为什么?
答案 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;