Сохранение вложенных объектов с помощью linq для сущностей - PullRequest
1 голос
/ 15 декабря 2009

У меня есть пользовательский интерфейс, который представляет пользователю ряд флажков, и для каждого из них мне нужно создать запись в таблице сопоставления.

LookupTable <- MapTable -> DataTable

У меня есть пользовательское связующее для DataTable, но я не могу понять, как его получить для создания объектов MapTable.

Возможно ли это? Использование asp.net MVC 1.0 и LINQ to Entities.

1 Ответ

2 голосов
/ 15 декабря 2009

Вам нужно позаботиться о двух шагах. (1) Добавьте вновь выбранные значения и (2) удалите невыбранные значения. Вам понадобится такой метод в вашем классе LookupTable.

public void SynchronizeDataTables(IEnumerable<DataTable> dataTables)
{
    // get the current data tables. call ToList() to force and enumeration.
    // without the ToList(), you'll get a "Sequence Changed during Enumeration"
    // error
    var currentDataTables = MapTable.Select(m => m.DataTable).ToList();

    // if the table is selected, but not in the data store add it.
    foreach (var dataTable in dataTables)
    {
        if (!currentDataTables.Contains(dataTable))
        {
            MapTables.Add(new MapTable { DataTable = dataTable });
        }
    }

    // if the table is in the data store, but not selected, then remove it.
    foreach (var dataTable in currentDataTables)
    {
        if (!dataTables.Contains(dataTable))
        {
            MapTables.Remove(dataTable);
        }
    }
}

Редактировать : Когда я это делал, я использовал LINQ-to-SQL и перебирал только выбранные идентификаторы, а не весь объект. Это сложнее, потому что LINQ-to-Entities создает немного другие объекты, чем LINQ-to-SQL, потому что он не раскрывает идентичность FK. Небольшая модификация:

public void SynchronizeDataTables(IEnumerable<int> dataTableIds)
{
    // get the current data tables. call ToList() to force and enumeration.
    // without the ToList(), you'll get a "Sequence Changed during Enumeration"
    // error
    var currentDataTableIds = MapTable.Select(m => m.DataTable.Id).ToList();

    // if the table is selected, but not in the data store add it.
    foreach (var dataTableId in dataTableIds)
    {
        if (!currentDataTableIds.Contains(dataTableId))
        {
            var dataTable = ???; // some method to fetch data table with ID = dataTableId
            MapTables.Add(new MapTable { DataTable = dataTable });
        }
    }

    // if the table is in the data store, but not selected, then remove it.
    foreach (var dataTable in currentDataTableIds )
    {
        if (!dataTableIds.Contains(dataTableId ))
        {
            var dataTable = ???; // some method to fetch data table with ID = dataTableId
            MapTables.Remove(dataTable);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...