【发布时间】:2020-03-05 02:44:27
【问题描述】:
我正在尝试使用 AutoMapper 模拟更新孩子。这些关系与“On Delete Cascade”是一对多的。
我的步骤:
- 加载包含详细信息的主文件
- 将 master 映射到 masterDTO
- 更新/更改 masterDTO 中的详细信息
- 将 masterDTO 映射回 master
- 保存。
问题是:master 更新了,添加了新的细节。但更新后的细节不是持久性。
这是我的课程:
public class Master
{
public int id {get;set;}
public string masterInfo {get;set;}
public virtual ICollection<Detail> details { get;set; } = new Collection<Detail>();
}
public class Detail
{
public int id {get;set;}
public int masterId {get;set;}
public virtual Master master {get;set;}
public string detailInfo {get;set;}
}
public class MasterDTO
{
public int id {get;set;}
public string masterInfo {get;set;}
public virtual ICollection<DetailDTO> details { get; set;} = new Collection<DetailDTO>();
}
public class DetailDTO
{
public int id {get;set;}
public int masterId {get;set;}
public virtual MasterDTO master {get;set;}
public string detailInfo {get;set;}
}
DbContext 设置:
public class MyContext : DbContext
{
public DbSet<Master> Masters {get;set;}
public DbSet<Detail> Details {get;set;}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer(
@"Server=localhost;Database=Test_AutoMapper;Trusted_Connection=True");
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Entity<Master>()
.HasMany<Detail>(m => m.details)
.WithOne(d => d.master)
.HasForeignKey(d => d.masterId)
.OnDelete(DeleteBehavior.Cascade);
}
}
这里是 StartUp 程序和 Automapper 设置:
static void Main(string[] args)
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Master, MasterDTO>().ForMember(a => a.details, map => map.MapFrom(src => src.details));
cfg.CreateMap<Detail, DetailDTO>();
cfg.CreateMap<MasterDTO, Master>().ForMember(a => a.details, map => map.MapFrom(src => src.details));
cfg.CreateMap<DetailDTO, Detail>();
});
IMapper mapper = config.CreateMapper();
var context = new MyContext();
var master = context.Masters.Include(m => m.details).find(1);
// there is master in db with id = 1
var masterDTO = mapper.Map<Master, MasterDTO>(master);
masterDTO.masterInfo = "Changed value";
foreach (DetailDTO element in masterDTO.details) {
element.detailInfo = "Changed value";
}
var newElement = new DetailDTO {id = 0, masterId = 1, detailInfo="New Detail"};
masterDTO.details.Add(newElement);
master = mapper.Map(masterDTO, master);
context.SaveChanges();
}
上次模拟我得到这个结果
Before : After :
Master Master
+----+-------------------+ +----+-------------------+
| id | masterInfo | | id | masterInfo |
+----+-------------------+ +----+-------------------+
| 1 | Old Master Info 1 | | 1 | Changed value |
| 2 | Old Master Info 2 | | 2 | Old Master Info 2 |
+----+-------------------+ +----+-------------------+
Detail Detail
+----+----------+-------------------+ +----+----------+-------------------+
| id | masterId | detailInfo | | id | masterId | masterInfo |
+----+----------+-------------------+ +----+----------+-------------------+
| 1 | 1 | Old Detail Info 1 | | 1 | 1 | old Detail Info 1 |
| 2 | 1 | Old Detail Info 2 | | 2 | 1 | Old Detail Info 2 |
| | | | | 3 | 1 | New detail |
+----+----------+-------------------+ +----+----------+-------------------+
2 行详细信息未更新
感谢您的建议。 - 吉谷
【问题讨论】:
标签: c# entity-framework automapper relationship