I am a pretty much a newbie to Entity Framework (specifically version 4) and I am trying to understand an issue I have.
I have an ASP.NET MVC2 project I am using with Entity Framework 4 and a Repository class. I have a simple foreign key relationship that I have defined. When I run my MVC project I am able to load the MVC form and update the foreign key relationship by setting Foreign Key ID on my entity. I do this by calling the OnPropertyIDChanging in a partial class and setting the EntityKey like so
this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value);
I have created a second project which is a command line project I use to load the initial data for the model. However, when I call into the Repository object to add the entity I get a cannot insert Null values into the child entity table (Manufacturer). If I explicitly set a reference on the parent object (Product) to the child object (Manufacturer) calling my repository to get a manufacturer object and setting the product's manufacturer object I get an exception stating
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
I assume this is a result of having a global reference to the Entity context on each of my repository objects, and as a result I have an open context for the Manufacturer and the product.
In doing some research, I have seen that by loading the object from a query, that the object relationships are explicitly created via a RelationshipEntry object. This does not happen when I am creating the objects in my command line application. What is the way to get around this? I assume I will have the same issue if I try and create a Web Service since I am creating the object without calling SQL first.
Secondly, is there a best practice on managing the context? Is it better to have the context created and disposed within each repository method, a global reference in each of the repository objects or a context that gets passed to each repository constructor?
Thanks!
John