我的任务是完成CRUD系统(Ironic)现代化的光荣使命。我正在使用EF 6.1.1和WebApi。我使用DTO发送实体(动态对象现在将在所有工作时创建静态类型,也将进行调用async
)
[HttpGet]
public dynamic Get(int id)
{
var p = personRepository.Get(id);
return new
{
p.PersonId,
p.BirthYear,
p.DeathYear,
p.Comment,
PersonNames = p.PersonNames.Select(pn => new { pn.PersonId, pn.PersonNameId, pn.NameTypeId, pn.Firstname, pn.Prefix, pn.Surname })
};
}
然后,我使用Person
和PersonNames
Knockout
对象上的字段或添加/删除/更新ko.mapping
集合
我将结果发布到此WebApi方法
[HttpPost]
public void Post([FromBody]Person person)
{
personRepository.Merge(person);
}
personRepository.Merge
我已经尝试了
public void Merge(Person person)
{
db.People.AddOrUpdate(person);
db.SaveChanges();
}
这适用于个人对象上的字段,但它不适用于PersonNames
如果不编写手动合并代码,我可以支持吗?
解决方案 结束了这个
public void Merge(Person person)
{
db.People.AddOrUpdate(person);
var existingNames = db.PersonNames.Where(pn => pn.PersonId == person.PersonId).ToList();
var deleted = existingNames.Where(pn => person.PersonNames.All(d => d.PersonNameId != pn.PersonNameId));
db.PersonNames.RemoveRange(deleted);
foreach (var name in person.PersonNames)
{
db.PersonNames.AddOrUpdate(name);
}
db.SaveChanges();
}
答案 0 :(得分:4)
鉴于你已经提到过这是一个CRUD系统,这对我来说都很合理。我看不出你怎么能真正避免从你的DTO回到你的域实体(例如Person)
我希望你已经考虑过了,但是如何使用类似AutoMapper的东西尽可能多地删除样板代码? https://github.com/AutoMapper/AutoMapper
导航属性的映射确实很复杂(即,DTO的对象图之间的映射回到实体的对象图)。这个链接比我更详细:http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/