Я пытаюсь обернуть голову в Принадлежащие Сущности и отношения между ними и другими Сущностями. Я работаю над очень простым примером с Products, Quotes и QuoteItems:
public class Product
{
public Product(Guid id, decimal price, string name, DateTime creationDate)
{
Id = id;
Price = price;
Name = name;
CreationDate = creationDate;
}
public Guid Id { get; }
public decimal Price { get; }
public string Name { get; }
public DateTime CreationDate { get; }
}
public class Quote
{
public Quote(Guid id, DateTime creationDate)
{
Id = id;
CreationDate = creationDate;
QuoteItems = new List<QuoteItem>();
}
public Guid Id { get; }
public DateTime CreationDate { get; }
public ICollection<QuoteItem> QuoteItems { get; }
}
public class QuoteItem
{
private QuoteItem() { }
public QuoteItem(Guid id, Product product, int quantity)
{
Id = id;
Quantity = quantity;
Product = product;
}
public Guid Id { get; }
public Product Product { get; }
public int Quantity { get; }
}
очень просто, ничего особенного. Продукты и цитаты должны рассматриваться как «совокупный корень», тогда как QuoteItems, конечно, являются «объектами значения».
Вот как я настраиваю контекст БД:
public class CommerceDbContext : DbContext
{
public CommerceDbContext(DbContextOptions<CommerceDbContext> options)
: base(options)
{
Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new QuoteEntityTypeConfiguration());
}
public DbSet<Product> Products { get; set; }
public DbSet<Quote> Quote { get; set; }
}
internal class QuoteEntityTypeConfiguration : IEntityTypeConfiguration<Quote>
{
public void Configure(EntityTypeBuilder<Quote> builder)
{
builder.ToTable("Quotes", "dbo");
builder.HasKey(r => r.Id);
builder.Property(e => e.CreationDate);
builder.OwnsMany(s => s.QuoteItems, b =>
{
b.ToTable("QuoteItems", "dbo");
b.Property(e => e.Id);
b.Property(e => e.Quantity);
b.HasOne(e => e.Product)
.WithMany()
.HasForeignKey("ProductId");
});
}
}
который генерирует именно то, что я хочу:
![enter image description here](https://i.stack.imgur.com/nz8Oo.png)
обратите внимание, что в таблице QuoteItems есть FK для продуктов. На самом деле было бы неплохо иметь QuoteId как просто FK, а не как часть PK, но я, вероятно, над этим поработаю позже.
Моя проблема сейчас в том, что я могу создавать Продукты без проблем, но когдаЯ пытаюсь создать цитату и добавить этот продукт, я получаю эту ошибку:
![enter image description here](https://i.stack.imgur.com/xz8AQ.png)
В принципе кажется, что добавление цитаты добавит продукт, а такжеНовая сущность в контексте БД, что создает проблему. Но продукт был создан ранее и правильно записан в БД.
Есть идеи?