Собственные объекты с отношениями «один ко многим» в EF Core 3 - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь обернуть голову в Принадлежащие Сущности и отношения между ними и другими Сущностями. Я работаю над очень простым примером с 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

обратите внимание, что в таблице QuoteItems есть FK для продуктов. На самом деле было бы неплохо иметь QuoteId как просто FK, а не как часть PK, но я, вероятно, над этим поработаю позже.

Моя проблема сейчас в том, что я могу создавать Продукты без проблем, но когдаЯ пытаюсь создать цитату и добавить этот продукт, я получаю эту ошибку:

enter image description here

В принципе кажется, что добавление цитаты добавит продукт, а такжеНовая сущность в контексте БД, что создает проблему. Но продукт был создан ранее и правильно записан в БД.

Есть идеи?

1 Ответ

1 голос
/ 07 октября 2019

решается загрузкой экземпляра Product из того же DbContext, который использовался для сохранения предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...