簡體   English   中英

實體框架6添加外鍵

[英]Entity Framework 6 Adding foreign key

我有一個模特

public class Order
{
    [Key]
    public int ID { get; set;}

    public string Name { get; set; }
}

public class Consumer
{
    public virtual List<Order> Orders { get; set;}
}

我遇到的問題是,當您創建一個Consumer對象並引用現有的Order ,是否有一種方法可以僅傳遞Order ID並允許實體框架完成其余工作。

我可以使其正常工作的唯一方法如下:

//Look up order
var order = dbContext.Order.Where(x=>x.ID == orderID)
var consumer = new Consumer { new List{ order} };
dbContext.Consumer.Add(consumer);

有沒有一種方法,而無需查找訂單? 僅插入命令鍵示例? 像這樣:

var consumer = new Consumer {
    new List { 
       new Order { ID = orderID } 
    } 
};
dbContext.Consumer.Add(consumer);

注意:最大的區別是,我只需要傳遞“ orderID”,而不必實際傳遞整個Order對象。

更新

public class Order
{
    [Key]
    public int ID { get; set;}

    public string Name { get; set; }

    public virtual List<Order> InheritedOrders{ get; set;}
}

DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<EntityClass>().HasMany(x=>x.InheritedOrders).WithMany().Map(cs =>
            {
                cs.MapLeftKey("ParentID");
                cs.MapRightKey("ChildID");
                cs.ToTable("OderInheritance");
            });
}

在這種情況下,由於您引用了相同ype的對象,並且使用了自動生成的WithMany生成的表,因此它將如何工作?

感謝:D

您將需要在訂單模型中具有參考鍵。 像這樣:

public class Order
{
    [Key]
    public int ID { get; set;}

    public string Name { get; set; }

    public int ConsumerId { get; set; }

    public virtual Consumer Consumer { get; set; }
}

public class Consumer
{
    public Consumer()
    {
        this.Orders = new HashSet<Order>();
    }

    public virtual List<Order> Orders { get; set;}
}

然后,您可以添加沒有訂單的消費者。

var consumer = new Consumer { };
dbContext.Consumer.Add(consumer);

以后添加訂單時,您可以像這樣附加消費者。

var order = new Order {
    Id = 1,
    Name = "Order 1",
    ConsumerId = 1
};
dbContext.Order.Add(order);

然后像這樣查詢回來...

foreach (Order order in Consumer.Orders)
{
    // do something with each order.
}

UPDATE

對於上述問題,我假設您是說您如何找到子訂單? 如果您使用Fabio提供的代碼,則可以像這樣獲取記錄...

foreach (var order in Consumer.Orders.ChildOrders)
{
    // Do something with the child orders
}

或嵌套

foreach (var order in Consumer.Orders)
{
    // parent order

    foreach (var childOrder in order.ChildOrders)
    {
        // child orders of parent.
    }
}

您可以像下面這樣建立自關系(1:n):

public class Order
{
    [Key]
    public int ID { get; set;}

    public string Name { get; set; }

    public int? ParentOrderId{ get; set; }

    public virtual Order ParentOrder { get; set; }

    public virtual ICollection<Order> ChildOrders { get; set; }
}

制圖:

modelBuilder.Entity<Order>()
    .HasOptional(i => i.ParentOrder)
    .WithMany(i => i.ChildOrders)
    .HasForeignKey(i => i.ParentOrderId)
    .WillCascadeOnDelete(false);

插入順序(如@ sgtrice1所說):

var order = new Order 
{
    Name = "Order 1",
    ParentOrderId = 1 // FK HERE, IT WILL MAKE THE RELATIONSHIP
};
dbContext.Order.Add(order);
dbContext.SaveChanges();

暫無
暫無

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

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