[Mise à jour]
Parce que L2E est utilisé, vous devez d'abord enregistrer tous les objets liés avant de pouvoir enregistrer l'objet principal. Ce qui a du sens sinon tu créerais (dans mon exemple) un artiste sans son objet contact. Ceci n'est pas autorisé par la conception de la base de données.
[/ Mise à jour]
Voici ma mise en œuvre qui a fonctionné.
[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");
}
Et puis dans mon ContactRepository:
public Contact CreateContact(Contact contact)
{
_entities.AddToContact(contact); //no longer throws the exception
_entities.SaveChanges();
return contact ;
}
J'ai aussi trouvé sur ce site qu'il est préférable de garder le même contexte dans l'application, donc je suis maintenant avec une classe de données spéciale pour ceci:
Rick Strahl et Samuel Maecham m'ont appris que vous devriez garder votre datacontext par utilisateur par demande. Ce qui signifie le mettre dans le HttpContext pour les applications web. Lisez-tout 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;
}
}
}
Merci Peter, je passe environ une heure à essayer de trouver la même solution. Merci encore – Geo