冠军

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Entity Framework 4.1 之五:多对多的关系

原文名称:Entity Framework 4.1: Many to Many Relationships (5)

原文地址:http://vincentlauzon.wordpress.com/2011/04/15/entity-framework-4-1-many-to-many-relationships-5/

看到 Entity Framework 4.1 推荐英文教程,为了帮大家看起来方便一些,简单翻译一下。这是一个系列,共有 8 篇,这是第 5 篇。
 
  1. Entity Framework 4.1 之一 : 基础
  2. Entity Framework 4.1 之二 : 覆盖默认的约定
  3. Entity Framework 4.1 之三 : 贪婪加载和延迟加载
  4. Entity Framework 4.1 之四:复杂类型
  5. Entity Framework 4.1 之五:多对多的关系
  6. Entity Framework 4.1 之六:乐观并发
  7. Entity Framework 4.1 之七:继承
  8. Entity Framework 4.1 之八:绕过 EF 查询映射

这篇文章讨论多对多的关系。

让我们从最简单的例子开始。我们让 EF4.1 来推断表的映射。我在订单和雇员之间建模多对多的关系。

复制代码
publicclass Order
{
publicint OrderID { get; set; }
[Required]
[StringLength(
32, MinimumLength =2)]
publicstring OrderTitle { get; set; }
[Required]
[StringLength(
64, MinimumLength=5)]
publicstring CustomerName { get; set; }
public DateTime TransactionDate { get; set; }
publicbyte[] TimeStamp { get; set; }

publicvirtual List<OrderDetail> OrderDetails { get; set; }
publicvirtual List<Employee> InvolvedEmployees { get; set; }
}

publicclass Employee
{
publicint EmployeeID { get; set; }
publicstring EmployeeName { get; set; }

publicvirtual List<Order> Orders { get; set; }
}
复制代码

我简单地在订单表中加入一个雇员的列表,在雇员表中加入了一个订单的列表。瞧,这是映射到的表。

现在,我们要控制两件事:

  • 关联表的名字
  • 在关联表中的两个列名

通过下面的代码可以实现:

复制代码
modelBuilder.Entity<Employee>()
.HasMany(e
=> e.Orders)
.WithMany(e
=> e.InvolvedEmployees)
.Map(m
=>
{
m.ToTable(
"EmployeeOrder");
m.MapLeftKey(
"EmployeeID");
m.MapRightKey(
"OrderID");
});
复制代码

基本上,我们说一个雇员管理多个订单,每个订单涉及多个雇员,因此,我们有了多对多的关系。我们的关联表名为 EmployeeOrder ,左键 (从雇员的角度看,是雇员键) 名为 employee-id,右键名为 order-id。

这样,你可以控制没有直接映射到类的表。

就使用这种模型而言,则是非常简单和自然。

复制代码
privatestaticvoid ManyToMany()
{
using (var context =new MyDomainContext())
{
var order
=new Order
{
OrderTitle
="Pens",
CustomerName
="Mcdo’s",
TransactionDate
= DateTime.Now,
InvolvedEmployees
=new List<Employee>()
};
var employee1
=new Employee { EmployeeName ="Joe", Orders =new List<Order>() };
var employee2
=new Employee { EmployeeName ="Black", Orders =new List<Order>() };

context.Orders.Add(order);

order.InvolvedEmployees.Add(employee1);
order.InvolvedEmployees.Add(employee2);

context.SaveChanges();
}
复制代码

在这个例子中,我甚至都没有在数据上下文中将雇员加入到雇员的集合中,因为他们被引用到订单的集合中,EF 帮我们完成了。

posted on   冠军  阅读(19248)  评论(26编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示