[Update]
Поскольку L2E используется вам необходимо сохранить все связанные объекты, прежде чем вы можете сохранить основной объект. Что имеет смысл, иначе вы бы создали (в моем примере) художника без его контактного объекта. Это не допускается дизайном базы данных.
[/ Update]
Вот моя реализация, которая сработала.
[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");
}
А потом в моей ContactRepository:
public Contact CreateContact(Contact contact)
{
_entities.AddToContact(contact); //no longer throws the exception
_entities.SaveChanges();
return contact ;
}
Я также нашел на этом сайте, что лучше всего, чтобы сохранить тот же контекст, на протяжении всего приложения, так что я теперь использует специальный класс данных для это:
Rick Strahl и Samuel Maecham научили меня, что вы должны хранить свой datacontext для каждого пользователя за запрос. Это означает, что он помещается в HttpContext для веб-приложений. Читайте об этом 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;
}
}
}
Спасибо, Питер, я трачу около часа, пытаясь найти то же самое решение. Еще раз спасибо – Geo