【发布时间】:2019-08-13 13:43:33
【问题描述】:
我想了解以下两个表结构以及“OrderId”外键是如何生成的:-
订单表:-
public class Order : BaseEntity, IAggregateRoot
{
private Order()
{
// required by EF
}
public Order(string buyerId, Address shipToAddress, List<OrderItem> items)
{
Guard.Against.NullOrEmpty(buyerId, nameof(buyerId));
Guard.Against.Null(shipToAddress, nameof(shipToAddress));
Guard.Against.Null(items, nameof(items));
BuyerId = buyerId;
ShipToAddress = shipToAddress;
_orderItems = items;
}
public string BuyerId { get; private set; }
private readonly List<OrderItem> _orderItems = new List<OrderItem>();
public IReadOnlyCollection<OrderItem> OrderItems => _orderItems.AsReadOnly();
public DateTimeOffset OrderDate { get; private set; } = DateTimeOffset.Now;
public Address ShipToAddress { get; private set; }
public decimal Total()
{
var total = 0m;
foreach (var item in _orderItems)
{
total = item.UnitPrice * item.Units;
}
return total;
}
}
订单项表
public class OrderItem : BaseEntity
{
public CatalogItemOrdered ItemOrdered { get; private set; }
public decimal UnitPrice { get; private set; }
public int Units { get; private set; }
protected OrderItem()
{ }
public OrderItem(CatalogItemOrdered itemOrdered, decimal unitPrice, int units)
{
ItemOrdered = itemOrdered;
UnitPrice = unitPrice;
Units = units;
}
}
订单实体配置
public class ConfigureOrder : IEntityTypeConfiguration<Order>
{
public void Configure(EntityTypeBuilder<Order> builder)
{
var navigation = builder.Metadata.FindNavigation(nameof(Order.OrderItems));
navigation.SetPropertyAccessMode(PropertyAccessMode.Field);
builder.OwnsOne(o => o.ShipToAddress);
}
}
订单商品实体配置
public class ConfigureOrderItem : IEntityTypeConfiguration<OrderItem>
{
public void Configure(EntityTypeBuilder<OrderItem> builder)
{
builder.OwnsOne(i => i.ItemOrdered);
builder.Property(oi => oi.UnitPrice).IsRequired(true).HasColumnType("decimal(18,2)");
}
}
OrderItems 表:-
Id(PK)
ItemOrdered_CatalogItemId
ItemOrdered_ProductName
ItemOrdered_PictureUri
UnitPrice
Units
OrderId(FK)
请帮助我了解如何将 OrderId(Foreign Key) 添加到表结构中。我已经浏览了上述代码,但无法弄清楚这个 FK 是如何生成的,当我检查迁移文件 OrderId 是否反映在约束下时!
【问题讨论】:
-
我在您的
OrderItem表中看不到ProductName、PictureUrl等 -
这些属性来自 CatalogItemOrdered,这很好,因为它们是在 configureOrderItem entitybuilder 中配置的。我的问题是 OrderId(FK) 是如何出现在表中的,因为它在项目中没有声明。然而,迁移有这个限制。因此,我想知道这种关系/关联是如何基于上述模型发生的?
标签: asp.net-mvc asp.net-core entity-framework-core