简体   繁体   English

实体框架6添加外键

[英]Entity Framework 6 Adding foreign key

I have a model 我有一个模特

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

    public string Name { get; set; }
}

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

The problem I have is when you create a Consumer object and reference existing Order , is there a way to just pass the Order ID and allow entity framework to do the rest. 我遇到的问题是,当您创建一个Consumer对象并引用现有的Order ,是否有一种方法可以仅传递Order ID并允许实体框架完成其余工作。

The only way I could get it to work is the following: 我可以使其正常工作的唯一方法如下:

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

Is there a way to do this without the looking up the order? 有没有一种方法,而无需查找订单? Example by just plugging in the order Key? 仅插入命令键示例? Something like this: 像这样:

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

Note: the big difference is that I just pass the "orderID" and don't have to actually pass the whole Order object. 注意:最大的区别是,我只需要传递“ orderID”,而不必实际传递整个Order对象。

Update : 更新

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

    public string Name { get; set; }

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

in DbContext : 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");
            });
}

In this case, how would it work since your reference an object of the same ype and your using a auto generated WithMany generated table? 在这种情况下,由于您引用了相同ype的对象,并且使用了自动生成的WithMany生成的表,因此它将如何工作?

Thanks, D 感谢:D

You would need to have a reference key in the order model. 您将需要在订单模型中具有参考键。 like so: 像这样:

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;}
}

Then you can add the Consumer without an order. 然后,您可以添加没有订单的消费者。

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

Later when you add the Order you can attach the Consumer like so... 以后添加订单时,您可以像这样附加消费者。

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

And query it back like so... 然后像这样查询回来...

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

UPDATE UPDATE

With your above question I'm assuming you mean how do you find the child orders? 对于上述问题,我假设您是说您如何找到子订单? If you use the code Fabio provided you could fetch the records like so... 如果您使用Fabio提供的代码,则可以像这样获取记录...

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

or nested 或嵌套

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

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

You can make a self-relationship (1:n) like this: 您可以像下面这样建立自关系(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; }
}

Mapping: 制图:

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

Insert Order (As @sgtrice1 said): 插入顺序(如@ 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