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 篇。
這篇文章討論多對多的關系。
讓我們從最簡單的例子開始。我們讓 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; }
}
{
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");
});
.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();
}
{
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 幫我們完成了。
浙公網安備 33010602011771號