C# EF Core 3中拥有一对多关系的所有实体

C# EF Core 3中拥有一对多关系的所有实体,c#,entity-framework,.net-core,C#,Entity Framework,.net Core,我试着把我的头脑集中在拥有的实体以及它们和其他实体之间的关系上。 我正在研究一个关于产品、报价和QuoteItems的非常简单的示例: public class Product { public Product(Guid id, decimal price, string name, DateTime creationDate) { Id = id; Price = price; Na

我试着把我的头脑集中在拥有的实体以及它们和其他实体之间的关系上。 我正在研究一个关于产品、报价和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; }
    }
公共类产品
{
公共产品(Guid id、十进制价格、字符串名称、DateTime creationDate)
{
Id=Id;
价格=价格;
名称=名称;
肌酸盐=肌酸盐;
}
公共Guid Id{get;}
公共十进制价格{get;}
公共字符串名称{get;}
公共日期时间创建日期{get;}
}
公开课报价
{
公共报价(Guid id,DateTime creationDate)
{
Id=Id;
肌酸盐=肌酸盐;
QuoteItems=新列表();
}
公共Guid Id{get;}
公共日期时间创建日期{get;}
公共ICollection QuoteItems{get;}
}
公共类引用项
{
私有QuoteItem(){}
公共QuoteItem(Guid id、产品、整数数量)
{
Id=Id;
数量=数量;
产品=产品;
}
公共Guid Id{get;}
公共产品产品{get;}
公共整数数量{get;}
}
很简单,没什么特别的。产品和报价被视为“聚合根”,而报价项当然是“价值对象”

以下是我配置db上下文的方式:

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");
            });
        }
    }
公共类CommerceDbContext:DbContext
{
公共CommerceDbContext(DbContextOptions选项)
:基本(选项)
{
数据库。请重新创建();
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
ApplyConfiguration(新的QuoteEntityTypeConfiguration());
}
公共数据库集产品{get;set;}
公共数据库集引号{get;set;}
}
内部类QuotentityTypeConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建造商。可转让(“报价单”、“dbo”);
HasKey(r=>r.Id);
建筑商财产(e=>e.CreationDate);
builder.OwnsMany(s=>s.QuoteItems,b=>
{
b、 ToTable(“报价单”、“dbo”);
b、 属性(e=>e.Id);
b、 属性(e=>e.Quantity);
b、 HasOne(e=>e.Product)
.有很多
.HasForeignKey(“ProductId”);
});
}
}
这正是我想要的:

请注意QuoteItems表如何在产品上具有FK。事实上,将QuoteId作为FK而不是PK的一部分是很好的,但我可能会在以后处理它

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

基本上,添加报价将在db上下文中添加产品和新实体,从而产生问题。但是,该产品已经创建并正确写入数据库


有什么想法吗?

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