2

我有一個模型實體框架6添加外鍵

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我的問題是,有沒有辦法只有通過訂單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); 

注:最大的區別是,我只是通過「單編號」,並沒有真正通過整個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

+0

是的,將'new Order {ID = orderID}'作爲'Unchanged'添加到上下文中。 –

+0

你是什麼意思的「Uncahnged」。我試過這樣做,並且從未創建關係 – darewreck

回答

2

你可以做一個自我的關係(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(); 
+0

謝謝,但這不是問題.....你說的是我在我的問題中已經說過的。問題是如何在不爲數據庫對象進行提取的情況下實際添加關係。我不是問你如何建立關係。 – darewreck

2

你需要有順序模型的引用鍵。像這樣:

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

有了你上面的問題,我假設你的意思是你怎麼找到奇爾d命令?如果您使用代碼法比奧提供您可以像這樣獲取記錄...

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. 
    } 
} 
+0

如何處理引用相同類型對象列表的情況。我用這個例子更新了我的問題。謝謝 – darewreck