更新关系而不加载导航属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新关系而不加载导航属性相关的知识,希望对你有一定的参考价值。

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

* Order -1Customer

CustomerOrder的导航酒店)

如果我在CustomerId中将Order定义为外键,我可以通过以下代码更新CustomerOrder

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

但是,如果我没有在CustomerId中定义Order,有没有类似的方法来更新这个关系而不加载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()for导航属性。

答案

声明两个具有导航属性的类。使用主键上的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; }
}

Remigrate之后你可以这样做:

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

以上是关于更新关系而不加载导航属性的主要内容,如果未能解决你的问题,请参考以下文章

EF更新多对多关系表中记录的时候,无法更新关系表的问题。

如何更新导航抽屉中的有状态小部件,同时在 Android 中保持与片段相同的类?

异步任务片段背景数据

无法获取要更新实体框架中导航属性的关系

如何在滚动列表视图上显示/隐藏底部导航视图?

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性