实体框架代码优先读写桥表

时间:2016-04-08 05:50:10

标签: c# sql asp.net-mvc entity-framework ef-code-first

我只有一个关于桥(链接)表的简单问题。我有两个具有many-to-many关系的表,Visual Studio会自动从这两个表中生成带有primary key的桥表。关于如何从表读取数据和向表写入数据,我有点困惑。

当我读取数据时,是否只从两个具有many-to-many关系的表中的一个或两个查询和获取数据?但是我该如何处理桥牌表?

当我写数据时,同样的事情是,我将数据保存到两个具有many-to-many关系的表中的一个或两个吗?我怎么知道何时应该保存到桥牌表?

非常混乱,我找不到任何可以学习的代码示例的好教程。由于我使用读取和写入Controllers创建了Views,我认为这个问题在自动生成的代码中得到了解决,但由于桥接表是空的,尽管我已将数据添加到其他表中,我需要问这个问题,以便对此有所了解!如果有任何可以通过简单的示例或链接告诉我它是如何工作的。谢谢!

编辑:某些表的表实体。我正在使用ASP.NET MVC做这个项目。

public class Order
{
public int ID { get; set; }
public string Name { get; set; }
public int? ManufacturerID { get; set; }
public virtual Manufacturer Manufacturer { get; set; }
public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public int EmployeeNumber { get; set; }
public virtual ICollection<Timeunit> Timeunits { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}

2 个答案:

答案 0 :(得分:3)

上述关系将创建一个桥接表,如:

public class OrderEmployeeEnrollments{
  public int OrderId {get;set;}
  public int EmployeeId {get;set;}
}

Order表中为员工读取数据:

using (var context = new YourContext())
{
  var order= context.Orders.Where(o => o.OrderEmployeeEnrollments.
               Any(e => e.Employee.EmployeeId == employeeId );
}

要插入Order表:

using (var context = new YourContext())
{
   var order= new Order{
     Name="",
     ManufacturerID= 2 ,
     Manufacturer = new Manufacturer { // create  Manufacturer },
     Employees = new List<Employee> { // create list}    
  }
  context.Orders.Add(order);
  context.SaveChanges();
}

要向现有员工插入“订单”表:

 using (var context = new YourContext())
{
   var order= new Order{
     Name="",
     ManufacturerID= 2 ,         
     Employees = context.Employees.Where(e=> e.Name=="Name")    
  }
  context.Orders.Add(order);
  context.SaveChanges();
}

希望这会有所帮助:)

答案 1 :(得分:2)

实体框架的工作方式使您不必关心桥接表。只要您定义了实体之间的关系,它就会为您处理。

在这种情况下:

public class Order
{
    ...
    public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{
    ...
    public virtual ICollection<Order> Orders { get; set; }
}

这是一个例子..
WRITE:

    Order order = new Order();
    order.Name = "foo";
    order.Employees = _ctx.Employees.Where(e => id > 0 && id <= 5);
    _ctx.Orders.Add(order);
    _ctx.SaveChanges();

READ:

    List<Employee> employees = _ctx.Employees.Where(e => id > 0 && id <= 5);

    foreach(Employee emp in employees)
    {
       Order theOrder = emp.Orders.FirstOrDefault(o => o.ID == order.ID);
       if(theOrder != null)
       {
           Console.WriteLine("Employee {0} has served order {1}", emp.ID, theOrder.ID);
       }
    }