我已经构建了我的域模型层、我的存储库层,现在我正在处理我的 DTO 层以供 webApi 项目使用。我正在实施更新服务方法,我想知道部分更新。这是我的 DTO 课程:
public class FullPersonDto
{
public FullPersonDto()
{
Friends = new List<Person>();
}
public FullPersonDto(Person person)
{
PersonId = person.PersonId;
DateCreated = person.DateCreated;
Details = person.Details;
Friends = new List<Person>();
foreach (Person friend in person.Friends)
{
Friends.Add(new PersonDto(friend));
}
}
[Key]
public int PersonId { get; set; }
[Required]
public virtual DateTime DateCreated { get; set; }
public virtual string Details { get; set; }
public List<Person> Friends { get; set; }
public Person ToEntity()
{
var person = new Person
{
PersonId = PersonId,
DateCreated = (DateTime) DateCreated,
Details = Details,
Friends = new List<Person>()
};
foreach (PersonDto friend in Friends)
{
person.Friends.Add(friend.ToEntity());
}
return person;
}
}
这是我的存储库中的更新方法:
public Person UpdatePerson(Person person)
{
var entry = _db.Entry(person);
if (entry.State == EntityState.Detached)
{
var dbSet = _db.Set<Person>();
Person attachedPerson = dbSet.Find(person.PersonId);
if (attachedPerson != null)
{
var attachedEntry = _db.Entry(attachedPerson);
attachedEntry.CurrentValues.SetValues(person); // what if values are null, like ID, or DateCreated?
}
else
{
entry.State = EntityState.Modified;
}
}
SaveChanges();
return person;
}
我的问题是:如果我只需要通过我的 webAPI 更新一个人的详细信息怎么办?是构造一个完整的 PersonDto 并使用 SetValues 更新整个对象的约定,还是有什么方法可以指定我只想要更新一个字段,这样我就不必通过网络发送大量数据(即我真的不需要)?
如果可以进行部分更新,那么何时更新整个实体最好?即使我必须更新 5/7 属性,它也需要我发送 2/7 的旧数据以重新写入,以便 SetValues 不会将空值从我的 DTO 写入我的字段。
这里的任何帮助都会很棒......对这些东西完全陌生,并尝试正确学习所有内容。谢谢你。