Попытка сохранить сущность, которая была сохранена в состоянии элемента управления ASP.NET, используя EntityFramework - PullRequest
3 голосов
/ 02 декабря 2011

Это сводит меня с ума, особенно потому, что у меня есть подозрение, что либо есть простое исправление, либо я слишком много спрашиваю об EF ...

Ситуация такая:

У меня есть пользовательский элемент управления (ASCX), который в основном служит формой редактирования для объекта EF.Когда контрольные данные привязываются, я вытаскиваю объект из базы данных по идентификатору и помещаю его в состояние управления (переопределяя SaveControlState() и LoadControlState()).

Затем пользователь продолжает свой веселый путь, внося любые изменения иличто-нет.Этот объект имеет свойства навигации, поэтому, когда они вносят изменения в свойство навигации, скажем, добавляя местоположение в коллекцию местоположений на объекте, я обновляю dataItem в состоянии элемента управления.

Наконец,после того, как пользователь все сделал и нажал кнопку «Сохранить», я пытаюсь сохранить или создать запись, используя следующий код:

protected void SaveButton_Click(object sender, EventArgs e)
{
    DepartmentLookup dept = Master.DataContext
        .Departments.Find(ResourceDepartment.SelectedValue.ToInt());

    LocationLookup location = dataItem.Locations[ResourceLocation.SelectedIndex];
    if (dataItem.OfficeLocation == null)
    {
        dataItem.OfficeLocation = new OfficeLocationLookup()
        {
            Location = location,
            OfficeLocationName = location.LocationName
        };
    }
    else if (!dataItem.OfficeLocation.Location.Equals(location))
    {
        dataItem.OfficeLocation.Location = location;
        dataItem.OfficeLocation.OfficeLocationName = location.LocationName;
    }

    foreach (LocationLookup loc in dataItem.Locations)
    {
        if (loc.LocationTypeID == default(int))
        {
            LocationTypeLookup locType = Master.DataContext
                .LocationTypes.SingleOrDefault(lt =>
                    lt.LocationType == loc.LocationType.LocationType);

            if (locType != null)
                loc.LocationType = locType;
        }
        else
        {
            LocationTypeLookup locType = Master.DataContext
                .LocationTypes.Find(loc.LocationTypeID);
            if (locType.LocationType != loc.LocationType.LocationType)
            {
                LocationTypeLookup newType = new LocationTypeLookup()
                {
                    LocationType = loc.LocationType.LocationType
                };

                loc.LocationType = newType;
            }
        }
    }

    dataItem.PrimaryPhone = PrimaryPhone.Text;
    dataItem.CellPhone = CellPhone.Text;
    dataItem.Department = dept;
    dataItem.EmailAddress = EmailAddress.Text;
    dataItem.LastModifiedBy = HttpContext.Current.User.Identity.Name;
    dataItem.LastModifiedDtm = DateTime.UtcNow;

    if (dataItem.ResourceID == default(int))
        Master.DataContext.Resources.Add(dataItem);
    else
    {
        DbEntityEntry<Resource> entry = Master.DataContext.Entry<Resource>(dataItem);
        if (entry != null && entry.State == EntityState.Detached)
        {
            Master.DataContext.Resources.Attach(dataItem);
            // entry.State = EntityState.Modified;
        }
    }

    Master.DataContext.SaveChanges();
}

Я пробовал несколько различных способов попытаться сохранить объект вбазы данных, все это приводит к различным ошибкам.Единственным методом, который не выбрасывал исключение, был метод SetValues, который также не сохранял ни одно из свойств навигации и, следовательно, оказался бесполезным.

Любая помощь или предложения вообщеБуду очень признателен здесь, поскольку я уже несколько дней ломаю голову над этой проблемой.

Заранее спасибо!J

1 Ответ

1 голос
/ 02 декабря 2011

У меня была похожая проблема при сохранении объектов сущности в сеансе (а не в состоянии управления). Проблема заключалась в том, что у извлеченных объектов было множество различных ObjectContexts, и это приводило к сбоям сохранения.

Это зависит от того, как вы управляете контекстом, но лучше всего связать контекст с объектом Request и использовать класс фабрики для его извлечения, поэтому вы используете один контекст для запроса.

HttpContext.Current.Items["Context"] = context

Любой другой шаблон вызвал у меня большие проблемы.

По моему опыту, нецелесообразно сохранять всю сущность в сеансе (или ControlState) из-за сложности управления контекстами. Контексты будут исходить из разных запросов, даже если используется вышеуказанный (очень безопасный) шаблон. В итоге я просто сохранил идентификаторы объектов в Session (ControlState) и использовал класс-обертку для их получения. Я сохранил объекты, которые хотел передать в коллекции Request, а не все, что осталось после обратных передач.

Это мой очень жалобный вопрос о моей собственной борьбе в аналогичной области. Надеюсь, что это пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...