如何在实体框架代码中指定复合密钥
-
08-10-2019 - |
题
我有一个关于在之间建立映射的快速问题 [Order Details]
, [Products]
和 [Orders]
在北方数据库中。
[Order Details]
没有主钥匙,看起来像这样
[Order Details]
OrderId (int)
ProductId (int)
...
所以我的问题是如何(我可以)设置我的 OrderDetails
这样的课?
public class OrderDetails
{
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
public Decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public Decimal Discount { get; set; }
}
我的数据上下文看起来像这样
public class NorthwindDb : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetails> OrderDetails { get; set; }
public DbSet<Customer> Customers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new OrderDetailsConfiguration());
}
public static void InitializeBecauseOfThatWeirdMetaDataThingThatIDontUnderstandYet()
{
Database.SetInitializer<NorthwindDb>(null);
}
}
和我的 OrderDetailsConfiguration
(空,因为我不知道我在做什么)
public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
public OrderDetailsConfiguration()
{
//HasKey(x => x.Order.OrderId);
//HasKey(x => x.Product.ProductId);
}
}
任何提示或想法都会很棒。
解决方案
首先,您必须明确放入PK和FKS内部 订单详细信息 班级:
public class OrderDetails
{
public int OrderID { get; set; }
public int ProductID { get; set; }
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
public Decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public Decimal Discount { get; set; }
}
然后,使用以下代码,您可以指定PK OrderDetailsconfiguration 班级:
(请注意 北风 数据库两者 Orderid 和 productid 是PK 订单详细信息 桌子)。
public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
public OrderDetailsConfiguration()
{
HasKey(od => new
{
od.ProductID,
od.OrderID
});
}
}
而且您也可以使用 retreateTatabaseifModelchanges 每当您更改类模型时,都会迫使您的数据库重新创建数据库:
Database.SetInitializer<NorthwindDb>(
new RecreateDatabaseIfModelChanges<NorthwindDb>());
有趣的一点是,一旦您做出了这些更改,EF将自动从 订单详细信息 阶级并建立关系 订单 和 产品 基于Ordorid和Productid的表 代码的约定:
代码首先将推断出任何名称的属性
<navigation property name><primary key property name>
(IE ProductsproductId),<principal class name><primary key property name>
(IE ProductProductId)或<primary key property name>
(IE ProductID),具有与主键相同的数据类型,代表了关系的外键。如果找到多个匹配项,则在上面列出的顺序中给出了优先级。外键检测不会对情况敏感。
其他提示
用[键]属性标记键字段。如果复合键,x = 0、1、2,...编号可以从任何数字开始https://msdn.microsoft.com/en-us/data/jj591583.aspx