1.In order to add new records in the database you have to create new objects in your foreach loop.
2.A 2nd problem is the fact that you are reading the same booking promo code for each item and should be read only ones before the foreach.
3.A 3rd optimisation could be to save all changes only ones at the end of the foreach.
The modified source code should be:
var P = DB.BookPromoCodes.OrderByDescending(X => X.Id).FirstOrDefault().Id;
foreach(var i in Model.BookDetail)
{
PromoCodeForSpecificBook obj = new PromoCodSpecificBook();
obj.BookId = i.ID;
obj.PromoCodeId =P;
DB.PromoCodeForSpecificBooks.InsertOnSubmit(obj);
}
DB.SubmitChanges();