Как вставить в Entity Framework пользовательскую ассоциацию «многие ко многим»? - PullRequest
0 голосов
/ 18 октября 2018

Я создал все свои сущности на основе учебника, и, похоже, он работает, по крайней мере, мои таблицы базы данных созданы, но я просто не могу понять, как вставить какие-либо новые данные со следующей настройкой:

Мои классы моделей:

public class Coffee 
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CoffeeId { get; set; }

        [MaxLength(100)]
        [Required]
        public string Name { get; set; }

        [MaxLength(100)]
        [Required]
        public string ImagePath { get; set; }

        [MaxLength(100)]
        [Required]
        public string Price { get; set; }

        [MaxLength(400)]
        [Required]
        public string Description { get; set; }

        public virtual ICollection<IngredientCoffees> Ingredients { get; set; }
}

public class Ingredient 
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int IngredientId { get; set; }

        [MaxLength(100)]
        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
        public string Name { get; set; }

        [Required]
        public int Amount { get; set; }

        [Required]
        [StringLength(10, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 1)]
        public string Unit { get; set; }

        public virtual ICollection<IngredientCoffees> Coffees { get; set; }
}

public class IngredientCoffees 
{
        public int Coffee_Id { get; set; }
        public int Ingredient_Id { get; set; }

        public virtual Coffee Coffee { get; set; }
        public virtual Ingredient Ingredient { get; set; }

        public int amount { get; set; }
}

И в методе OnModelCreating моего DbContext класса у меня есть это:

builder.Entity<IngredientCoffees>()
                .HasKey(ic => new { ic.Coffee_Id, ic.Ingredient_Id });

builder.Entity<IngredientCoffees>()
                .HasRequired(ic => ic.Coffee)
                .WithMany(ic => ic.Ingredients)
                .HasForeignKey(ic => ic.Coffee_Id);

builder.Entity<IngredientCoffees>()
                .HasRequired(ic => ic.Ingredient)
                .WithMany(ic => ic.Coffees)
                .HasForeignKey(ic => ic.Ingredient_Id);

Все это приведет кследующая структура базы данных:

мои таблицы

Как вставить новый Coffee с уже существующими компонентами в базу данных, чтобы они были объединены в моем IngredientCoffeesтаблица, где я также хочу установить для них столбец «сумма»?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Я уже нашел решение для моей проблемы!Кажется, что EF обрабатывает многие отношения, когда вы хотите иметь пользовательский столбец (в моем случае amount) немного по-другому, поэтому вам нужно больше работать вручную, по крайней мере, это то, что я прочитал.Вот как я это сделал:

//create a new coffee
var americano = new Coffee 
            {
                Name = "Americano",
                ImagePath = "https://imgurl.jpg",
                Price ="5",
                Description = "Americano is a type of coffee drink prepared by.."
            };

//select existing ingredient from the db
            var coffee_powder = context.Ingredients.Where(i => i.Name == "coffee powder")
                            .SingleOrDefault();

//if found, create a new IngredientCoffee
            if (coffee_powder != null) {
                var ingredientCoffees = new IngredientCoffees { Coffee = americano, Ingredient = coffee_powder, amount = 8 };

//add it, with this your new coffee will be created automatically too
                context.IngredientCoffees.Add(ingredientCoffees);


                context.SaveChanges();

            }

Это создаст вашу новую строку и правильные идентификаторы в связанной таблице.

0 голосов
/ 18 октября 2018

Вы можете использовать массив или список

if (context.Coffee .Any())
        {
            return;   // DB has been seeded
        }
 var coffees = new Coffee []
        {
            new Coffee { Name = "Coffee name",   ImagePath = "/[your path]",
                Price = "[price]", Description ="description" },
             new Coffee {......................}

         }

       foreach (Coffee coffee in coffees)
        {
            context.Coffee.Add(coffee);
        }
        context.SaveChanges();

То же самое вы можете сделать с ингредиентом в том же файле

var ingredients= new Ingredient []
        {
            new Ingredient { Name = "Ingredient name",  
                 Amount = [your amount], Unit = "[ your unit ]"  },
             new Ingredient {......................}

         }

       foreach (Ingredient ingredient in ingredients)
        {
            context.Ingredient.Add(ingredient);
        }
        context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...