如何定义一个 table 其主键由 2 个外键和 EF 代码优先构造而成
How to define a table that its primary key is constructed from 2 foreign keys with EF code-first
我正在使用模型通过 EF 代码优先定义我的 table。
我有 Item 模型和 Order 模型。
项目:
public class Item
{
public int ItemID { get; set; }
[Required]
public int Price { get; set; }
[Required]
public int AmountLeft { get; set; }
[Required]
public string Image { get; set; }
[Required]
public string Description { get; set; }
[Required]
public string FullDescription { get; set; }
[Required]
public DateTime PublishDate { get; set; }
public int CompanyID { get; set; }
public int CategoryID { get; set; }
// Navigation properties
public virtual Company Company { get; set; }
// Navigation properties
public virtual Category Category { get; set; }
}
订购型号:
public class Order
{
public int OrderID { get; set; }
[Required]
public DateTime DeliveryDate { get; set; }
[Required]
public string Currency { get; set; }
[Required]
public int TotalAmount { get; set; }
public List<int> Items { get; set; }
public DateTime OrderDate { get; set; }
public int UserID { get; set; }
// Navigation properties
public virtual User user { get; set; }
}
我想创建另一个 table,它将被称为 ItemInOrder,它只有 2 个字段:ItemID 和 OrderID。
主键将是这 2 个外键。
我试图定义这个模型:
public class ItemInOrder
{
public int OrderID { get; set; }
public int ItemID { get; set; }
// Navigation properties
public virtual Order order { get; set; }
public virtual Item item { get; set; }
}
但是我遇到了错误。我试图在两个字段上都添加 [Key] 符号,但仍然出现错误。
我怎样才能创建我想要的table?
当您需要使用复合 PK 创建 table 时,您需要指定键的顺序。有两种变体:
您可以覆盖上下文中的 OnModelCreating
方法,并尝试使用这些 Fluent Api 配置:
// Configure the primary keys for the ItemInOrder in the order you want
modelBuilder.Entity<ItemInOrder>()
.HasKey(t => new{t.OrderID,ItemID);
modelBuilder.Entity<ItemInOrder>()
.HasRequired(io=>io.Order)
.WithMany()
.HasForeigKey(io=>io.OrderID);
modelBuilder.Entity<ItemInOrder>()
.HasRequired(io=>io.Item)
.WithMany()
.HasForeigKey(io=>io.ItemID);
使用 Data Annotations 的第二个变体应该是这样的:
[Key]
[Column(Order=1)]
[ForeignKey("Order")]
public int OrderID { get; set; }
[Key]
[Column(Order=2)]
[ForeignKey("Item")]
public int ItemID { get; set; }
EF 会注意到您想要创建两个关系,它会为您完成这项工作。
我正在使用模型通过 EF 代码优先定义我的 table。
我有 Item 模型和 Order 模型。
项目:
public class Item
{
public int ItemID { get; set; }
[Required]
public int Price { get; set; }
[Required]
public int AmountLeft { get; set; }
[Required]
public string Image { get; set; }
[Required]
public string Description { get; set; }
[Required]
public string FullDescription { get; set; }
[Required]
public DateTime PublishDate { get; set; }
public int CompanyID { get; set; }
public int CategoryID { get; set; }
// Navigation properties
public virtual Company Company { get; set; }
// Navigation properties
public virtual Category Category { get; set; }
}
订购型号:
public class Order
{
public int OrderID { get; set; }
[Required]
public DateTime DeliveryDate { get; set; }
[Required]
public string Currency { get; set; }
[Required]
public int TotalAmount { get; set; }
public List<int> Items { get; set; }
public DateTime OrderDate { get; set; }
public int UserID { get; set; }
// Navigation properties
public virtual User user { get; set; }
}
我想创建另一个 table,它将被称为 ItemInOrder,它只有 2 个字段:ItemID 和 OrderID。 主键将是这 2 个外键。
我试图定义这个模型:
public class ItemInOrder
{
public int OrderID { get; set; }
public int ItemID { get; set; }
// Navigation properties
public virtual Order order { get; set; }
public virtual Item item { get; set; }
}
但是我遇到了错误。我试图在两个字段上都添加 [Key] 符号,但仍然出现错误。
我怎样才能创建我想要的table?
当您需要使用复合 PK 创建 table 时,您需要指定键的顺序。有两种变体:
您可以覆盖上下文中的 OnModelCreating
方法,并尝试使用这些 Fluent Api 配置:
// Configure the primary keys for the ItemInOrder in the order you want
modelBuilder.Entity<ItemInOrder>()
.HasKey(t => new{t.OrderID,ItemID);
modelBuilder.Entity<ItemInOrder>()
.HasRequired(io=>io.Order)
.WithMany()
.HasForeigKey(io=>io.OrderID);
modelBuilder.Entity<ItemInOrder>()
.HasRequired(io=>io.Item)
.WithMany()
.HasForeigKey(io=>io.ItemID);
使用 Data Annotations 的第二个变体应该是这样的:
[Key]
[Column(Order=1)]
[ForeignKey("Order")]
public int OrderID { get; set; }
[Key]
[Column(Order=2)]
[ForeignKey("Item")]
public int ItemID { get; set; }
EF 会注意到您想要创建两个关系,它会为您完成这项工作。