Entity Framework Сохранение сопоставления «многие ко многим» - PullRequest
0 голосов
/ 30 декабря 2011

Я немного новичок в 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 не работает.

Я открыт для любых предложений.

Спасибо.

...