关于Entity Framework主从表的增删改,我们来一步步讲解。
什么是主从表
主从表是数据表之间的一种关系,主表中的记录可以关联多个从表中的记录。在关系数据库的设计中,使用主从表可以避免数据的重复存储和冗余,提高数据的查询效率。在Entity Framework中,我们使用外键关联的方式来实现主从表之间的关系。
主从表增加
1. 先增加主表的记录,再增加从表的记录
在Entity Framework中,首先需要创建数据模型,并且定义主从表的关联关系,在这个模型中,使用导航属性表示从表到主表的关系。当需要增加主从表中的记录时,我们需要按照以下步骤进行操作:
- 创建一个主表的实例。
- 创建一个从表的实例,并设置从表的外键属性为主表的主键值。
- 将从表的实例添加到主表的导航属性中。
- 将主表和从表都添加到数据上下文中。
- 保存数据上下文的更改。
以下是一个示例代码,假设有一个订单(Order)主表和一个订单详情(OrderDetail)从表,两个实体分别定义如下:
public class Order
{
public int Id { get; set; }
public string CustomerName { get; set; }
public ICollection<OrderDetail> OrderDetails { get; set; }
}
public class OrderDetail
{
public int Id { get; set; }
public int OrderId { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public Order Order { get; set; }
}
我们可以按照以下步骤来创建一个订单和订单详情:
// 创建一个新订单实例
Order order = new Order
{
CustomerName = "John Smith"
};
// 创建一个订单详情实例,并设置订单ID外键属性
OrderDetail detail = new OrderDetail
{
Price = 10.0m,
Quantity = 2,
Order = order
};
// 将订单详情实例添加到导航属性中
order.OrderDetails.Add(detail);
// 将订单和订单详情添加到数据上下文中
using (var context = new MyContext())
{
context.Orders.Add(order);
context.OrderDetails.Add(detail);
context.SaveChanges();
}
2. 同时增加主表和从表的记录
我们也可以在同一个事务中同时添加主表和从表的记录,如果主表和从表的记录都能添加成功,则提交事务,否则撤消事务。在Entity Framework中,使用TransactionScope类可以实现分布式事务的功能。
以下是一个示例代码:
// 创建一个新订单和一个订单详情实例
Order order = new Order { CustomerName = "John Smith" };
OrderDetail orderDetail = new OrderDetail { Price = 10.0m, Quantity = 2 };
// 使用TransactionScope类实现分布式事务
using (var scope = new TransactionScope())
{
using (var context = new MyContext())
{
context.Orders.Add(order);
context.SaveChanges();
orderDetail.OrderId = order.Id;
orderDetail.Order = order;
context.OrderDetails.Add(orderDetail);
context.SaveChanges();
}
// 提交事务
scope.Complete();
}
主从表删除
1. 删除从表记录
如果需要删除从表中的记录,我们只需要先从数据上下文中查询出对应的记录,然后调用Remove方法将该记录从数据上下文中删除即可。在删除从表记录时,我们需要保证与该从表记录关联的主表记录不会被删除。示例如下:
using (var context = new MyContext())
{
// 查询订单详情记录
var orderDetail = context.OrderDetails.Find(1);
// 删除订单详情记录
context.OrderDetails.Remove(orderDetail);
context.SaveChanges();
}
2. 删除主表记录
如果需要删除主表中的记录,我们需要确保与该主表记录关联的从表记录也被删除,否则会出现关联完整性问题。在Entity Framework中,我们可以使用级联删除来实现删除主表及其关联的从表的功能。
以下是一个示例代码,假设在主表Order中,我们定义了一个级联删除配置:
modelBuilder.Entity<Order>()
.HasMany(o => o.OrderDetails)
.WithOne(d => d.Order)
.OnDelete(DeleteBehavior.Cascade);
我们可以直接删除主表的记录,子表中的关联记录将自动被删除:
using (var context = new MyContext())
{
// 查询订单记录
var order = context.Orders.Find(1);
// 删除订单记录
context.Orders.Remove(order);
context.SaveChanges();
}
以上就是关于Entity Framework主从表的增删改的攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework主从表的增删改 - Python技术站