[Actualización]
Debido L2E se utiliza es necesario guardar todos los objetos vinculados antes de poder guardar el objeto principal. Lo cual tiene sentido; de lo contrario, crearías (en mi ejemplo) un artista sin su objeto de contacto. Esto no está permitido por el diseño de la base de datos.
[/ Actualización]
Aquí está mi aplicación que funcionó.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "Id")] Artist artist, [Bind(Prefix = "Contact")] Contact contact, [Bind(Prefix = "Country")] Country country, [Bind(Prefix = "ContactRelationship")] ContactRelationship contactRelationship)
{
ViewData["Countries"] = new SelectList(new CountryService(_msw).ListCountries().OrderBy(c => c.Name), "ID", "Name");
ViewData["ContactRelationships"] = new SelectList(new ContactRelationshipService(_msw).ListContactRelationships().OrderBy(c => c.ID), "ID", "Description");
country = _countryService.GetCountryById(country.ID);
contact.Country = country;
contactRelationship = _contactRelationshipService.GetContactRelationship(contactRelationship.ID);
contact.ContactRelationship = contactRelationship;
if(_contactService.CreateContact(contact)){
artist.Contact = contact;
if (_service.CreateArtist(artist))
return RedirectToAction("Index");
}
return View("Create");
}
Y luego en mi ContactRepository:
public Contact CreateContact(Contact contact)
{
_entities.AddToContact(contact); //no longer throws the exception
_entities.SaveChanges();
return contact ;
}
También encontré en este sitio web que lo mejor es mantener el mismo contexto en toda la aplicación, así que estoy usando ahora una clase de datos especial para esto:
Rick Strahl y Samuel Maecham me han enseñado que debe mantener su datacontext por usuario por solicitud. Lo que significa ponerlo en el HttpContext para aplicaciones web. Leer todo sobre ella here
public class Data
{
public static MyDBEntities MyDBEntities
{
get
{
if (HttpContext.Current != null && HttpContext.Current["myDBEntities"] == null)
{
HttpContext.Current["myDBEntities"] = new MyDBEntities();
}
return HttpContext.Current["myDBEntities"] as MyDBEntities;
}
set {
if(HttpContext.Current != null)
HttpContext.Current["myDBEntities"] = value;
}
}
}
Gracias Peter, me paso alrededor de una hora tratando de buscar la misma solución. Gracias de nuevo – Geo