如何在 EF 核心中使用 OwnsMany 关系更新许多拥有的实体

时间:2021-03-29 08:38:49

标签: c# asp.net-core .net-core entity-framework-core

我正在使用域驱动设计在 .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 内部替换两部手机,一个使用新值,另一个使用旧值

1 个答案:

答案 0 :(得分:0)

您可以尝试使用以下代码

  var s1= await _context.Students.Where(x => x.Id == student.Id).SingleAsync();
  s1.Phones = student.Phones;
  _context.Update(s1);
  await _context.SaveChangesAsync();