Reputation: 103
Despite I'm completely new to .NET stack, I somehow managed to develop a small N-Tier application involving the following technologies:
WPF -> WCF -> Entity Framework -> SQL Server
My doubt is mainly about how Entity Framework manages the assignment of navigation properties. I'll put my data contract code to get the ball rollin' ...
[DataContract]
public class Problem
{
[DataMember]
public int ProblemId { get; set; }
[DataMember]
public String Title { get; set; }
[DataMember]
public String Description { get; set; }
[DataMember]
public int WorkerId { get; set; }
[DataMember]
public int WorkId { get; set; }
[DataMember]
[ForeignKey("WorkerId")]
public virtual Worker Worker { get; set; }
[DataMember]
[ForeignKey("WorkId")]
public virtual Work Work { get; set; }
}
[DataContract]
public class Worker
{
[DataMember]
public int WorkerId { get; set; }
[DataMember]
public String Name { get; set; }
[DataMember]
public virtual ICollection<Problem> Problems { get; set; }
}
[DataContract]
public class Work
{
[DataMember]
public int WorkId { get; set; }
[DataMember]
public String Name { get; set; }
[DataMember]
public virtual ICollection<Problem> Problems { get; set; }
}
In my Seed method, I'm doing the following:
Work Work1 = new Work()
{
WorkId = 1,
Name = "Work1"
};
Worker emp1 = new Worker()
{
WorkerId = 1,
Name = "Worker1"
};
Problem Problem1 = new Problem()
{
...
WorkId = 1,
WorkerId = 1
};
Problem Problem2 = new Problem()
{
...
Work = Work1,
Worker = emp1
};
//add objects to the context
context.Works.Add(Work1);
context.Workers.Add(emp1);
context.Problems.Add(Problem1);
context.Problems.Add(Problem2);
//added just for testing
Problem1.Work = Work1;
Problem1.Worker = emp1;
//finally: save changes
context.SaveChanges();
And the point is: after disposing the context & doing a query like: context.Problems.ToList() ... both problem1 & problem2 have its navigation properties (Worker, Work) assigned to Null. WorkerId and WorkId are stored, but no its related Objects inside the Problem Entity.
Am I missing something?
Thank you very much in advance for your answer!
Upvotes: 0
Views: 2007
Reputation: 14672
Yes, you need to do
context.Problems.Include(p=>p.Work).ToList()
in order to populate the children when you reload them under a new context.
Upvotes: 1