簡體   English   中英

實體框架代碼第一個數據庫用於一對一到多個關聯

[英]Entity Framework code first database for one to one to many association

我正在使用代碼構建一個使用entityframework的數據庫。 目的是使遠程數據庫與webservice調用同步。 我已經為webservice調用函數構建了一個結構化實體。

我如何編碼dB上下文以創建以下關聯?

cart.cs通過AssociationsCartAux提供cart_row,如下所示

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之間的關聯

  • AssociationsCartAux_id_virtual

  • cart_row_id_cartRow_fictive

當我重新加載數據同步==>沒有問題,當我重新加載數據同步與訂單更新==> dbo.AssociationsCartAuxes的數量加倍現有數據,盡管更新當前數據並只添加新數據。 涉及購物車和cart_row之間丟失linq關聯。 這讓我想我沒有正確構建我的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();
                }
            }

對於一對多的關系,您不需要輔助表,這對於:

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

我找到了答案,也許可以幫助某人建立這樣的第三級協會。 只需添加:modelBuilder.Entity()。ToTable(“carts”);

到db上下文如下。

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM