How to define a table so that its primary key is generated from 2 foreign keys with the first EF code

I am using models to define my tables using EF code first.

I have a product model and an order model.

Item:

 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; } 

    }

      

Order Model:

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; }

    }

      

I want to create another table called ItemInOrder which will only have 2 fields: ItemID and OrderID. the primary key would be these 2 foreign keys.

I tried to define this model:

   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; }

    }

      

But I got errors. I tried to put [Key] in both fields, but still I got errors.

how can i create the table i want?

+3


source to share


1 answer


When you need to create a table with composite PKs, you need to specify the order of your keys. There are two options:

You can override the method OnModelCreating

in your Context and try with these 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);

      



The second option using Data Annotation should be as follows:

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

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

      

EF will notice that you want to create two links, and it will do the job for you.

+1


source







All Articles