【问题标题】:Updating a relation without loading navigation property在不加载导航属性的情况下更新关系
【发布时间】:2018-09-09 06:49:02
【问题描述】:

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

Order*-1Customer

CustomerOrder 中的导航属性)

如果我将CustomerId 定义为Order 中的外键,我可以通过以下代码轻松更新OrderCustomer

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

但是如果我没有在Order 中定义CustomerId,有没有类似的方法可以在不加载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()作为导航属性。

【问题讨论】:

  • 那么订单类中到底有没有customerId字段?这很难理解
  • @TheGeneral:是的
  • 但如果我没有在 Order 中定义 CustomerId -- 为什么不呢?这将是实现您所描述的最简单(也是显而易见)的方法(在不加载客户实体的情况下更新此关系)。
  • 请阅读minimal reproducible example并采取行动。解释“导致运行时错误”。此外,您正在使用/遵循哪些信息建模和数据库设计参考?你对 FK 有什么看法?您似乎正在尝试解决一个非问题。 PS请通过帖子编辑澄清,而不是cmets。

标签: c# entity-framework foreign-keys ef-code-first navigation-properties


【解决方案1】:

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

【讨论】:

  • 但我不想定义外键。
  • @Masoud 为什么不呢?所以EF 无法理解它们之间的关系。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2011-10-29
  • 2020-07-18
相关资源
最近更新 更多