首页 > 解决方案 > 在不加载导航属性的情况下更新关系

问题描述

我有两个实体OrderCustomer具有以下关系:

Order*-1Customer

Customer是 中的导航属性Order

如果我很容易定义CustomerId为外键,我可以通过以下代码更新:OrderCustomerOrder

using(var ctx = new MyContext)
{
    var ord = new Order{ Id = 1, CustomerId = 10 };
    ctx.Orders.Attach(ord);
    ctx.Entry(ord).Property(x=>x.CustomerId).IsModified = true;
    ctx.SaveChanges();  
}

但是如果我没有定义CustomerIdOrder有没有类似的方法可以在不加载Customer实体的情况下更新这个关系?

以下代码导致运行时错误:

using(var ctx = new MyContext)
{
    var ord = new Order{ Id = 1, Customer = new Customer {Id = 10}};
    ctx.Orders.Attach(ord);
    ctx.Entry(ord).Property(x=>x.Customer).IsModified = true;
    ctx.SaveChanges();  
}

因为我们不能Property()用于导航属性。

标签: c#entity-frameworkforeign-keysef-code-firstnavigation-properties

解决方案


相互声明具有导航属性的两个类。ForeignKey用其主键上的属性标记其中一个表(从属表) 。

public class Customer
{
     public int Id { get; set; }

     public ICollection<Order> Orders { get; set; }
}

public class Order
{
     public int Id { get; set; }
     ...

     public int CustomerId { get; set; }

     [ForeignKey("CustomerId")]
     public Customer Customer{ get; set; }
}

重新迁移后,您可以这样做:

using(var ctx = new MyContext)
{
    var ord = new Order{ Id = 1, Customer = new Customer {Id = 10}};
    ctx.Orders.Add(ord);
    ctx.SaveChanges();  
}

推荐阅读