Я немного новичок в Entity Framework (4), и у меня есть конкретный сценарий, который оставил меня в тупике.У меня есть две основные сущности: Cylinder
и Location
.Между ними есть таблица сопоставления «многие ко многим»Другими словами, у Цилиндра есть коллекция Локаций, а у Локации есть коллекция Цилиндров.
Я использую целочисленные идентификаторы в качестве ПК для Цилиндра и Местоположения.
Эти объектыизвлекается как две коллекции (цилиндры и местоположения) из одного контекста и редактируется на клиенте.Редактирование Cylinder.Location[0]
изменит соответствующее местоположение в коллекции Locations, т. Е. Это тот же объект.
Теперь, когда приходит время сохранить на сервере, мой метод "update" берет список цилиндров исписок мест.Независимо сохранить цилиндры и местоположения просто.
ОБНОВЛЕНО:
Мой первоначальный подход заключается в следующем:
// Сохранить местоположения ...
foreach (var cylinderLocation in cylinderLocations)
{
if (cylinderLocation.ChangeTracker.State == ObjectState.Added)
cylinderLocation.Insert();
else if (cylinderLocation.IsDirty)
cylinderLocation.Update();
}
// CylinderLocation.Insert () выглядит следующим образом:
public static void Insert(this CylinderLocation cylinderLocation)
{
using (var context = new CylinderManagementModelContainer(GetConnectionString()))
{
if (cylinderLocation.Cylinder != null)
cylinderLocation.Cylinder.ModifiedTimeStamp = DateTime.Now;
cylinderLocation.ModifiedTimeStamp = DateTime.Now;
context.CylinderLocations.AddObject(cylinderLocation);
context.SaveChanges();
}
}
ОБНОВЛЕНИЕ: Вставка CylinderLocation () сохраняет CylinderLocation и Cylinder, если одинотображается на карте;однако, когда шаг SaveCylinders выполняется (ниже), он все еще думает, что есть новый Цилиндр с Id = 0. Другими словами, цилиндры [0] .Id = 0, но location [0] .Cylinder [0] .Id> 0.
// Сохранить Цилиндры ...
foreach (var cylinder in cylinders)
{
if (cylinder.ChangeTracker.State == ObjectState.Added)
cylinder.Insert();
else if (cylinder.IsDirty)
cylinder.Update();
}
Но когда я пытаюсь сохранить новый Цилиндр и новое Местоположение, все становится запутанным, и оба они должны быть сопоставлены каждомуДругой.Другими словами, Cylinder.Id = 0
, Location.Id = 0
, и они оба должны быть сохранены и сопоставлены друг с другом.
Я надеялся, что смогу обновить идентификаторы после сохранения (т. Е. Свойство use изменилось иобновить исходные объекты);однако, похоже, что после сериализации объектов на сервере Cylinder.Location[0]
перестает быть тем же объектом в коллекции Locations, т.е. это другой экземпляр.Так что обновление Id не работает.
Я открыт для любых предложений.
Спасибо.