c# - 在不加载导航属性的情况下更新关系
问题描述
我有两个实体Order
并Customer
具有以下关系:
Order
*-1Customer
(Customer
是 中的导航属性Order
)
如果我很容易定义CustomerId
为外键,我可以通过以下代码更新:Order
Customer
Order
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()
用于导航属性。
解决方案
相互声明具有导航属性的两个类。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();
}
推荐阅读
- python - 带有 for 循环的“SyntaxError:无法分配给文字”错误
- javascript - 展开/折叠闪亮的 selectInput 功能
- html - 位置固定的左侧属性在多个位置属性中左侧的浏览器中不起作用
- intel - openvino Model Emotions-recognition-retail 中的恐惧和厌恶
- docker - Traefik 2 如何在静态配置中引用 tls 证书以在 docker-compose 文件中进行路由
- node.js - 使用 socket.io 将数据从 express 服务器发送到 react-native 客户端
- python - 我应该怎么做才能减少代码的运行时间?
- windows - 在 docker 而不是 windows 上安装应用程序
- python - 如何确定分页的xpath?
- c# - 限制服务总线消息接收的 Azure Functions 速率