如何定义一个表,它的主键是由EF代码优先的2个外键构造的

本文关键字:代码 EF 2个 定义 一个 何定义 | 更新日期: 2023-09-27 17:51:12

我使用EF代码优先使用模型来定义我的表。

有一个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; }
    }

我想创建另一个表,它将被称为ItemInOrder,它将只有2个字段:ItemID和OrderID。主键是这两个外键。

我试着定义这个模型:

   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]符号,但还是出现了错误。

我将如何能够创建我想要的表?

如何定义一个表,它的主键是由EF代码优先的2个外键构造的

当您需要创建一个包含组合pk的表时,您需要指定键的顺序。有两种变体:

你可以重写上下文中的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);

使用数据注释的第二个变体应该是这样的:

[Key] 
[Column(Order=1)] 
[ForeignKey("Order")]
public int OrderID { get; set; }
[Key] 
[Column(Order=2)] 
[ForeignKey("Item")]
public int ItemID { get; set; }

EF会注意到你想创建两个关系,它会为你完成这项工作。