Entity Framework код первой базы данных для связи один к одному ко многим - PullRequest
0 голосов
/ 07 апреля 2019

Сначала я строю базу данных с помощью 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 <=== АССОЦИАЦИЯ МЕЖДУ КОРОБКОЙ И КАРТОЙ </p>1024 *

AssociationsCartAux_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();
                }
            }

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Я нашел ответ, может быть, он поможет кому-то создать такую ​​ассоциацию третьего уровня. Просто добавьте: 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
0 голосов
/ 07 апреля 2019

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

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

...