如何在插入多个新实体时更新我的​​DTO ID

时间:2012-03-16 19:14:46

标签: entity-framework

我正在使用EF4。我正在从DTO列表中添加一系列新实体,并且在添加所有实体之后我才会保存更改。我想将DTO的ID设置为新实体的ID。我怎么做到这一点? 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 个答案:

答案 0 :(得分:2)

我不认为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
}