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