Как я могу обновить свой идентификатор DTO при вставке нескольких новых объектов - PullRequest
1 голос
/ 16 марта 2012

Я использую EF4. Я добавляю ряд новых объектов из списка DTO и не сохраняю изменения до тех пор, пока все они не будут добавлены. Я хочу установить идентификаторы DTO в идентификаторы новых сущностей. Как же я могу это сделать? Предоставляет ли EF механизм для этого?

С одной сущностью я бы сделал это:

public void InsertMyDto(MyDto a_dto)
{
    var newEntity = new MyEntity
        {
            Name = a_dto.Name,
            Type = a_dto.Type.ToString(),
            Price = a_dto.Price
        };

    _dataContext.MyEntities.AddObject(newEntity);
    _dataContext.SaveChanges();

    a_dto.ID = newEntity.ID;
}

Это отлично работает, но что мне делать в этом случае?

public void InsertMyDtos(IEnumerable<MyDto> a_dtos)
{

    foreach (var myDto in a_dtos)
    {
        var newEntity = new MyEntity
            {
                Name = myDto.Name,
                Type = myDto.Type.ToString(),
                Price = myDto.Price
            };

        // Does some validation logic against the database that might fail.

        _dataContext.MyEntities.AddObject(newEntity);
    }

    _dataContext.SaveChanges();

    // ???
}

Я хочу сохранить все сразу, потому что у меня есть работа по проверке (не показана выше), которая выполняется с базой данных и происходит сбой до того, как она достигает SaveChanges, и если она не выполняется, я хочу, чтобы она провалилась как целая транзакция (т.е. откат).

1 Ответ

2 голосов
/ 17 марта 2012

Я не думаю, что EF может помочь вам здесь.Это даже не может помочь вам для одного экземпляра, который заставляет вас писать a_dto.ID = newEntity.ID.Аналогом этого кода для нескольких объектов является отслеживание пар dtos и новых объектов:

public void InsertMyDtos(IEnumerable<MyDto> a_dtos)
{
    Dictionary<MyDto, MyEntity> dict = new Dictionary<MyDto, MyEntity>();
    foreach (var myDto in a_dtos)
    {
        var newEntity = new MyEntity
            {
                Name = myDto.Name,
                Type = myDto.Type.ToString(),
                Price = myDto.Price
            };

        dict.Add(myDto, newEntity);

        // Does some validation logic against the database that might fail.

        _dataContext.MyEntities.AddObject(newEntity);
    }

    _dataContext.SaveChanges();

    foreach (var item in dict)
        item.Key.ID = item.Value.ID; // Key is MyDto, Value is MyEntity
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...