Ответ 1
Я решил свою проблему.
Позвольте мне предисловие, сказав, что я использую ASP.NET MVC - если вы пишете однопользовательское настольное приложение, ваша проблема может сильно отличаться от моей.
В моем случае я, по-видимому, придумал плохое решение проблемы, которая была у меня раньше.
Я создавал несколько экземпляров моего объектного контекста - и когда вы создаете сущности с одним экземпляром и пытаетесь связать их с сущностью, созданной другим экземпляром, вы получаете странные ошибки.
Чтобы обойти это, я подумал, ну, я просто сделаю так, чтобы у меня был только один объектный контекст. Поэтому я создал класс с открытым геттером, который создавал бы экземпляр, если он еще не был создан, и возвращает его. Вид одноэлементного шаблона, гарантирующий, что у меня был один объект-контекст для всего приложения.
В моем приложении я иногда создаю объекты "отбрасывания" - например. временный объект, иногда предварительно заполненный несколькими значениями по умолчанию, поэтому я могу отобразить форму. Когда форма отправляется, новый объект создается, заполняется, проверяется и затем сохраняется.
Сохранение завершится неудачно, если вы сообщите об ошибке, описанной на этой странице, о том, что некоторый атрибут пуст, даже если я заполнил все поля, и объект прошел проверку.
Проблема заключалась в том, что она не пыталась сохранить объект, который я только что создал, - он зависал от объекта "отбрасывания" из предыдущего запроса и сначала пытался сохранить его.
Исходя из PHP, то, что меня отбросило, было осознанием того, что приложения ASP.NET MVC имеют совершенно другой жизненный цикл из приложений PHP. В PHP запускаются сценарии, обрабатываются запросы, заканчиваются, потом заканчиваются, тогда как в ASP.NET они запускаются, выполняются некоторое время, обслуживая множество запросов, а затем, в конце концов, они заканчиваются и перезапускаются.
Создав свой объектный контекст в статическом методе, я создавал не один экземпляр для запроса, а один экземпляр для каждого приложения. Поскольку объект-контекст сохраняется между запросами, мои объекты "отбрасывания" будут накапливаться - и в конечном итоге, когда я попытаюсь сохранить SaveChanges(), он, конечно, потерпит неудачу.
Эта путаница частично связана с тем, что Entity Framework была написана с учетом настольных приложений - она не была разработана для жизненного цикла веб-приложения.
Вы можете обойти это, и вот решение:
public class App
{
public static MyEntities DB
{
get {
// Create (as needed) and return an object context for the current Request:
string ocKey = "MyEntities_" + HttpContext.Current.GetHashCode().ToString("x");
if (!HttpContext.Current.Items.Contains(ocKey))
HttpContext.Current.Items.Add(ocKey, new MyEntities());
return HttpContext.Current.Items[ocKey] as MyEntities;
}
}
}
Теперь вы можете использовать свой объект-контекст:
MyEntities DB = MyNamespace.App.DB;
Я нашел решение в этой длинной статье, в которой исследуются несколько (правильных и неправильных) способов управления жизненным циклом объектного контекста:
Надеюсь, это полезно для других: -)