ドメイン モデル レイヤー、リポジトリ レイヤーを構築しました。現在、webApi プロジェクトで使用する DTO レイヤーに取り組んでいます。Update サービス メソッドを実装している最中で、部分的な更新について疑問に思っています。これが私の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;
}
}
私のリポジトリの Update メソッドは次のとおりです。
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 を使用してオブジェクト全体を更新する慣例ですか、それとも、大量のデータをネットワーク経由で送信する必要がないように、1 つのフィールドのみを更新するように指定できる方法はありますか?私は本当に必要ありません)?
部分的な更新が可能である場合、エンティティ全体を更新するのはいつですか? 5/7 プロパティを更新する必要がある場合でも、SetValues が DTO からフィールドに null を書き込まないように、古いデータを 2/7 に送信して書き直す必要があります。
ここでの助けは素晴らしいでしょう...このことはまったく初めてで、すべてを正しく学ぼうとしています。ありがとうございました。