Код Entity Framework первая база данных для объединения «один ко многим»

#c# #database #entity-framework #entity-framework-6

#c# #База данных #entity-framework #entity-framework-6

Вопрос:

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

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

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 И CART_ROW

  • Ассоциацииscartaux_id_virtual

  • cart_row_id_cartRow_fictive

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

Я не знаком с entity framework, поэтому я попробовал какой-то способ сделать это, поместив 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();
                }
            }
  

Ответ №1:

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

 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://learn.microsoft.com/en-us/ef/core/modeling/relationships

Комментарии:

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

Ответ №2:

Я нашел ответ, может быть, это могло бы помочь кому-то создать такую ассоциацию третьего уровня. Просто добавьте: ModelBuilder.Entity().Итоговый («корзины»);

для контекста БД, как показано ниже.

в контексте db :

     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