Первая база данных кода Entity Framework для ассоциации "один ко многим"

Я создаю базу данных с помощью entityframework, сначала используя код. Цель состоит в том, чтобы синхронизировать удаленную базу данных с вызовом веб-сервиса. У меня уже есть структурированные объекты, созданные для функции вызова веб-сервиса.

Как мне нужно закодировать контекст дБ для создания следующей ассоциации?

cart.cs дает cart_row через AssociationsCartAux, как показано ниже.

public class order
{
    [Key]
    public long? id { get; set; }
    public long? id_cart { get; set; } //which is a foreign key
    public string invoice_number { get; set; }
    ....
}

public class cart
{
    public long? id { get; set; }
    ...
    public AssociationsCartAux associations { get; set; }
}

public class AssociationsCartAux : PrestaShopEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long? id_virtual { get; set; }
    public List<cart_row> cart_rows { get; set; }

    public AssociationsCartAux()
    {
        this.cart_rows = new List<cart_row>();
    }
}

public class cart_row
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long? id_cartRow_fictive { get; set; }
    public long? id_product { get; set; }
    public int quantity { get; set; }
    ....
}

Я попробовал следующий код в моем файле dbcontext

    public DbSet<cart> cart { get; set; }
    public DbSet<cart_row> cart_row { get; set; }
    public DbSet<order> order { get; set; }

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AssociationsCartAux>()
        .HasMany(p => p.cart_rows)
        .WithMany().Map(c =>
        {
            c.ToTable("cart_assocation");
        });

Когда я запускаю код, он строит следующие таблицы

dbo.carts

dbo.cart_row

dbo.AssociationsCartAuxes

  • id_virtual

dbo.cart_assocation <=== АССОЦИАЦИЯ МЕЖДУ ТЕЛЕЖКОЙ И CART_ROW

  • АссоциацииCartAux_id_virtual

  • cart_row_id_cartRow_fictive

когда я перезагружаю синхронизацию данных ==> нет проблем когда я перезагружаю синхронизацию данных с обновлением заказа ==> dbo.AssociationsCartAuxes удваивается в объеме в дополнение к существующим данным, несмотря на обновление текущих данных и добавление только новых. Включая потерю связи linq между cart и cart_row. Что позволило мне предположить, что я неправильно построил свой dbcontext.

Я не знаком с инфраструктурой сущностей, поэтому я попытался сделать это, поместив AssociationsCartAux.cs в качестве ComplexType, но не работал из-за объекта cart_row внутри.

Заранее спасибо за любую помощь.

Для дополнительной информации я указал, как я помещаю данные в таблицы.

            foreach (cart panier in listcart)
            {
                var result = ctx.cart.SingleOrDefault(b => b.id == panier.id);
                if (result == null)
                {
                    ctx.cart.Add(panier);
                    ctx.SaveChanges();
                }
            }

          foreach (order commande in listorder)
            {
                var result = ctx.order.SingleOrDefault(b => b.id == commande.id);
                if (result == null)
                {
                    ctx.order.Add(commande);
                    ctx.SaveChanges();
                }
            }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужна вспомогательная таблица для отношения «один ко многим», достаточно:

public class cart
{
    public long? id { get; set; }
    ...
    public List<cart_row> cart_rows { get; set; }
}

И магия EF сделает все остальное, хотя было бы неплохо явно определить отношения и на другом конце:

public class cart_row
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long? id_cartRow_fictive { get; set; }
    public long? id_product { get; set; }
    public int quantity { get; set; }
    ....
    public long? id_cart {get; set;}
    public cart cart {get; set;}
}

И в DbContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<cart_row>()
            .HasOne(cr => cr.cart)
            .WithMany(c => c.cart_rows)
            .HasForeignKey(cr => cr.id_cart);
    }

Но есть много других способов добиться этого, для получения дополнительной информации проверьте: https://docs.microsoft.com/en-us/ef/core/modeling/relationships

Спасибо Coder cat, если бы все было так просто, как вы говорите ^^. Я должен использовать это отношение сущностей, потому что архитектура создана для выполнения вызова веб-сервиса. Я могу получить доступ к данным cart_row только через AssociationsCartAuxes. Я просто выполняю добавление корзины после вызова xwebservice, и cart_row автоматически заполняет базу данных через ассоциациюCartAuxes. Поэтому я, к сожалению, не могу изменить архитектуру отношений.

Amystic 08.04.2019 10:29
Ответ принят как подходящий

Я нашел ответ, может быть, это могло бы помочь кому-то сделать такую ​​ассоциацию третьего уровня. Просто добавьте: modelBuilder.Entity().ToTable("тележки");

в контекст БД следующим образом.

в контексте БД:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<cart>()
            .HasRequired(s => s.associations)
            .WithRequiredPrincipal(ad => ad.cart);

        modelBuilder.Entity<cart_row>()
            .HasRequired(cr => cr.AssociationsCartAux)
            .WithMany(c => c.cart_rows)
            .HasForeignKey(cr => cr.id_AssocCartAux);

        modelBuilder.Entity<AssociationsCartAux>().ToTable("carts"); <== this solved my issue

Другие вопросы по теме