EF Core 3中具有一对多关系的拥有实体

时间:2019-10-07 14:37:19

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

我正在努力将自己的实体以及它们与其他实体之间的关系包围住。 我正在使用产品,报价和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表如何在Products上添加FK。实际上,将QuoteId设置为FK而不是PK的一部分会很好,但是我稍后可能会进行处理。

我现在的问题是我可以毫无问题地创建产品,但是当我尝试创建报价并添加该产品时,出现此错误:

enter image description here

基本上看来,添加引号会在数据库上下文中添加产品以及新实体,因此会产生问题。但是产品是先前创建的,并且已正确写入数据库。

有什么主意吗?

1 个答案:

答案 0 :(得分:1)

通过从用于保存报价的同一DbContext加载Product实例来解决。