Я использую EF4 с объектами POCO, 2 таблицы выглядят следующим образом
Услуга
ServiceID,
Название,
StatusID
Состояние
StatusID,
Имя
Объекты POCO выглядят так
Услуга
ServiceID,
Статус,
Имя
Состояние
StatusID,
Имя
С состоянием Status для объекта Service, являющегося свойством навигации и типа Status.
В моем сервисном репозитории у меня есть метод save, который принимает сервисные объекты, присоединяет его к контексту и вызывает save. Это хорошо работает для службы, но если состояние этой службы было изменено, оно не обновляется. Мой метод сохранения выглядит следующим образом
public static void SaveService(Service service)
{
using (var ctx = Context.CreateContext())
{
ctx.AttachModify("Services", service);
ctx.AttachTo("Statuses",service.Status);
ctx.SaveChanges();
}
}
Метод AttachModify присоединяет объект к контексту и устанавливает его в измененном виде, он выглядит следующим образом
public void AttachModify(string entitySetName, object entity)
{
if (entity != null)
{
AttachTo(entitySetName, entity);
SetModified(entity);
}
}
public void SetModified(object entity)
{
ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
Если я смотрю на профиль SQL, он даже не включает свойство навигации в обновлении для таблицы служб, он никогда не касается StatusID. Это сводит меня с ума. Любая идея, что мне нужно сделать, чтобы принудительно обновить свойство навигации?
Редактировать
Чтобы дать быстрый пример проблемы, вот быстрое консольное приложение, которое использует EF с моими объектами POCO для создания этой проблемы
static void Main(string[] args)
{
Service svc = GetService();
Console.WriteLine("Service : " + svc.Name + " , Status : " + svc.Status.Name);
//Change and save Status
svc.Status = GetStatus("Stopped");
using (var ctx = new TestEFContext())
{
//Status is changed
Console.WriteLine("Service : " + svc.Name + " , Status : " + svc.Status.Name);
ctx.AttachModify("Services", svc);
ctx.AttachTo("Statuses", svc.Status);
ctx.SaveChanges();
}
//Re-fetch service from db and check status
svc = GetService();
//Status is set back to its old value!!!!!!!!
Console.WriteLine("Service : " + svc.Name + " , Status : " + svc.Status.Name);
Console.ReadLine();
}
private static Service GetService()
{
using (var ctx = new TestEFContext())
{
return ctx.Services.Include("Status").FirstOrDefault();
}
}
private static Status GetStatus(string name)
{
using (var ctx = new TestEFContext())
{
return ctx.Statuses.Where(n=>n.Name == name).FirstOrDefault();
}
}
public class Service
{
[DataMember] public int ServiceID { get; set; }
[DataMember] public string Name { get; set; }
[DataMember] public Status Status { get; set; }
}
public class Status
{
[DataMember] public int StatusID { get; set; }
[DataMember] public string Name { get; set; }
}
Причина, по которой я не держусь за контекст, заключается в том, что в реальном приложении я пытаюсь использовать это на всем, что сделано в WCF автономно.