Это сводит меня с ума, особенно потому, что у меня есть подозрение, что либо есть простое исправление, либо я слишком много спрашиваю об 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