我正在使用域驱动设计在 .net 5 和 ef core 5 中实现一个 web api。 问题是:我有一个简单的聚合学生和一个像
这样的值对象电话public class Student
{
public long Id{ get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
public IReadOnlyCollection<Phone> Phones { get; private set; }
}
public class Phone
{
public string Key { get; private set; }
public string Value { get; private set; }
}
它是如何工作的,例如一个学生有两部手机,key phone 值为 123345,key mobile 值为 2345678 等
我正在使用 fluent api 来配置这个关系
class StudentConfiguration : IEntityTypeConfiguration<Student>
{
public const string StudentId = "StudentId";
public const string Key = "Key";
public void Configure(EntityTypeBuilder<Student> builder)
{
builder.ToTable("StudentsDB");
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).ValueGeneratedNever().IsRequired();
builder.Property(x => x.FirstName).HasMaxLength(25).IsRequired();
builder.Property(x => x.LastName).HasMaxLength(50).IsRequired();
builder.OwnsMany(
x => x.Phones,
builder =>
{
builder.ToTable("Phones");
builder.Property<long>(StudentId).IsRequired();
builder.WithOwner().HasForeignKey(StudentId);
builder.Property(x => x.Key).IsRequired();
builder.Property(x => x.Value).IsRequired();
builder.HasKey(StudentId, Key);
});
}
}
现在的问题是,我有一个业务要求,让学生能够更换手机,全部或其中一部(如果学生更换一部手机,我考虑的最简单的方法,在我的 api 内部替换两部手机,一个是新值,另一个是旧值)
但是现在我不知道如何实现这一点... update 方法更新整个学生实体,当我尝试调用集合 aw 导航时,我不知道如何继续..
public async Task UpdatePhones(Student student)
{
#warning must fix it , it update the whole entity
//var studentEntry = context.Attach(student);
context.Update(modification.Student);
//var phoneEntries = studentEntry.Collection(e => e.Phones);
//phoneEntries.IsModified = true;
await context.SaveChangesAsync();
}
注意:如果学生更换一部手机,我认为最简单的方法是在我的 api 内部替换两部手机,一个使用新值,另一个使用旧值
答案 0 :(得分:0)
您可以尝试使用以下代码
var s1= await _context.Students.Where(x => x.Id == student.Id).SingleAsync();
s1.Phones = student.Phones;
_context.Update(s1);
await _context.SaveChangesAsync();