Im wanting to use Entity Framework POCO in a disconnected (from context) mode. In my scenario I’m creating a new Parent object and want to attach an existing child object to it and then save it to the db.
The code below undesirably inserts a new Course record when saving a new Student record, when instead I want the existing Course record linked to the new Student record.
How can I do this in Entity Framework where…
- the objects can be disconnected from the context. (i.e. Queried in one context and then saved in a different context)
- I dont need to re-query the child record from the DB just so I can attach it to the parent when I’m saving to db. I really want to avoid doing extra trips to the db when I already have it as an object in memory.
This page shows a database diagram that the code below is based on http://entityframeworktutorial.net/EF4_EnvSetup.aspx#.UPMZ4m-UN9Y
class Program
{
static void Main(string[] args)
{
//get existing course from db as disconnected object
var course = Program.getCourse();
//create new student
var stud = new Student();
stud.StudentName = "bob";
//assign existing course to the student
stud.Courses.Add(course);
//save student to db
using (SchoolDBEntities ctx = new SchoolDBEntities())
{
ctx.Students.AddObject(stud);
ctx.SaveChanges();
}
}
static Course getCourse()
{
Course returnCourse = null;
using (var ctx = new SchoolDBEntities())
{
ctx.ContextOptions.LazyLoadingEnabled = false;
returnCourse = (from s in ctx.Courses
select s).SingleOrDefault();
}
return returnCourse;
}
}
I believe there are few ways of accomplishing this.
You can specify that course entity is unchanged rather than added, along these lines:
Or instruct your context, that you are working with existing entity:
More info here:
http://msdn.microsoft.com/en-us/data/jj592676.aspx
EDIT
There are some running samples from my solution, I verified they work as expected.
In all cases we have Publisher record in database with ID = 2 and Name = “Addison Wesley” (irrelevant to the example, but just for good measure).
Approach 1 – Setting Entity State
Approach 2 – Using Attach method
Approach 3 – Setting Foreign Key value
For this last approach to work I needed to add extra property PublisherId, it has to be named according to NavigationPropertyName + ‘Id” convention to be picked up by EF auotmatically:
I am using here EF5 Code First, but it is very similar to POCO.