我正在使用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
之前失败了,如果它失败了我希望它失败作为一个整个交易(即回滚)。
答案 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
}