Временные объекты с Entity Framework - PullRequest
0 голосов
/ 09 июня 2009

У меня есть EntityObject с именем Pathway, который напрямую связан с данными в таблице pathway. Моя база данных также хранит правила для настройки Pathway. То, что я хотел бы сделать, это создать объект Pathway в моем коде, который является результатом Pathway + PathwayCustomisations. Получившийся результат никогда не должен возвращаться в базу данных, это просто временная проекция, используемая в коде.

public static Pathway ApplyCustomisation(Pathway p, ICollection<PathwayCustomisation> c)
{
    Pathway resultant = new Pathway();
    if (!p.PathwayModule.IsLoaded) p.PathwayModule.Load();
    foreach (PathwayModule m in p.PathwayModule)
    {
        resultant.PathwayModule.Add(m);
    }
    foreach (PathwayCustomisation i in c)
    {
        switch (i.Command)
        {
            case "ADD":
                resultant.PathwayModule.Add(i.PathwayModule);
                break;
            case "DELETE":
                resultant.PathwayModule.Remove(i.PathwayModule);
                break;
        }
    }
    return resultant;
}

Этот метод подавляет первое препятствие, потому что я добавляю сущности PathwayModule во второй Pathway, когда они могут принадлежать только одному в модели / базе данных:

CoursePlanner.Test.PathwayTest.ApplyCustomisation:
System.InvalidOperationException : Collection was modified; enumeration operation may not execute.

Есть ли способ легко работать с проекциями Entity? Правильно ли я подхожу к проблеме?

Edit:

Я все еще получаю исключение, когда используется только первая часть метода:

public static Pathway ApplyCustomisation(Pathway p, ICollection<PathwayCustomisation> c)
{
    Pathway resultant = new Pathway();
    if (!p.PathwayModule.IsLoaded) p.PathwayModule.Load();
    foreach (PathwayModule m in p.PathwayModule)
    {
        resultant.PathwayModule.Add(m);
    }
    return resultant;
}

Приведенное выше перечисление не изменяет ту же коллекцию, которая перечисляется, а просто добавляет элементы во вторую коллекцию. Этот код дает то же исключение.

.NET3.5, C #, VS Express 2008

Спасибо

Daniel

1 Ответ

2 голосов
/ 09 июня 2009

Ваше исключение вызвано тем, что вы изменяете коллекцию при ее перечислении.

foreach (Item item in collection)
{
    collection.Add(something); // Not allowed.
    collection.Remove(something); // Not allowed, too.
}

Работа с объектами, такими как обычные объекты, не представляет проблем - вы должны только избегать того, чтобы объекты были присоединены к контексту объекта (прямо или косвенно через связанные объекты), и они не будут сохранены в базе данных.

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