我正在努力将自己的实体以及它们与其他实体之间的关系包围住。 我正在使用产品,报价和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");
});
}
}
它完全生成我想要的:
请注意QuoteItems表如何在Products上添加FK。实际上,将QuoteId设置为FK而不是PK的一部分会很好,但是我稍后可能会进行处理。
我现在的问题是我可以毫无问题地创建产品,但是当我尝试创建报价并添加该产品时,出现此错误:
基本上看来,添加引号会在数据库上下文中添加产品以及新实体,因此会产生问题。但是产品是先前创建的,并且已正确写入数据库。
有什么主意吗?
答案 0 :(得分:1)
通过从用于保存报价的同一DbContext加载Product实例来解决。