0

我有一堂课:

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已正确填充。

为什么?

4

3 回答 3

2

您应该创建Person如下:

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

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

于 2013-11-06T23:11:37.313 回答
0

我认为您需要为该人执行一个新查询。实体框架insert查询只会通过 using 返回新对象的 id SCOPE_IDENTITY(),因此不会加载相关对象。如果你这样做怎么办:

var newPerson = db.Persons.Find(P.Id);
var user = newPerson.User;
于 2013-11-06T18:10:18.280 回答
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属性。

于 2013-11-06T18:02:06.283 回答