Код: Выделить всё
public class DataSheet: Aggregate
{
private readonly List _categories = new();
public IReadOnlyCollection Categories => _categories.AsReadOnly();
// .... more code here
public void CreateCategory(string name)
{
var orderIndex = (uint)_categories.Count;
var category = new Category(name);
_categories.Add(category);
}
}
Код: Выделить всё
public class Category: Entity
{
public string Name { get; init; }
private Category() { }
public Category(string name): base(Guid.NewGuid())
{
Name = name;
}
}
< /code>
Я установил режим доступа к навигации в поле, как в документации Microsoft: < /p>
public class DataSheetConfiguration: IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasKey(b => b.Id);
var categoryNavigation = builder.Metadata.FindNavigation(nameof(DataSheet.Categories));
categoryNavigation.SetPropertyAccessMode(PropertyAccessMode.Field);
}
}
Код: Выделить всё
public class CategoryConfiguration: IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasKey(c => c.Id);
builder.Property(c => c.Name);
}
}
Код: Выделить всё
public class DataContext : IdentityDbContext
{
// ... other DbSets
public DbSet DataSheets { get; set; } = null!;
public DbSet Categories { get; set; } = null!;
public DataContext() { }
public DataContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new DataSheetConfiguration());
modelBuilder.ApplyConfiguration(new CategoryConfiguration());
}
}
Код: Выделить всё
var spec = new CompleteDataSheet(request.DataSheetId);
var sheet = await _dataSheetService.GetAsync(spec, cancellationToken);
sheet.CreateCategory(request.Name);
await _dataSheetService.UpdateAsync(sheet, cancellationToken);
public sealed class CompleteDataSheet: Specification
{
public CompleteDataSheet(Guid id)
{
Query
.Where(b => b.Id == id)
.Include(b => b.Categories);
}
}

After a lot of digging, I found that while the Categories Поле в DBContext имеет состояние «Изменено», объект DataShiet имеет состояние неизменного. Когда я насильственно устанавливаю все элементы в категориях в состояние «добавленного», итерация над ним и программно изменяя состояние, то новые элементы сохраняются. Это, однако, не является решением с точки зрения дизайна.
Ранее у меня была нормальная работа навигационного свойства, однако в этом случае использование все элементы в списке были инициализированы по инициализации сущности, и они только обновлялись, а не добавляли новые случаи. Сохраняйте их?
Подробнее здесь: https://stackoverflow.com/questions/785 ... -not-saved