EF代码优先:使用中间表将实体映射到现有数据库

时间:2011-04-18 13:10:44

标签: c# ef-code-first code-first entity-framework-4.1

这是一个示例场景。我有一个由下表组成的现有数据库;

订单,字段为 OrderId (PK,int)

产品,字段 ProductId (PK,int), PriceId (FK,int)

OrdersProducts ,包含字段 OrderProductId (PK,int), OrderId (FK,int), ProductId (FK,int), OrderingStatus (int)

字段 PriceId (PK,int)

价格

所有PK都是身份。

我的实体是;

public class Order
{
 [Key]
 public int OrderId { get; set; }
 public virtual IList<Product> Products { get; set; }
}

public class Product
{
 [Key]
 public int ProductId { get; set; }
 public string Name { get; set; }
 public int OrderingStatus { get; set; }

 public virtual Price Price { get; set;}

}

public class Price
{
 [Key]
 public int PriceId { get; set;}

}

这是我的映射; 订购;

  HasMany<Product>(x => x.Products)
    .WithMany()
    .Map(m =>
    {
      m.MapLeftKey("OrderId");
      m.MapRightKey("ProductId");
      m.ToTable("OrdersProducts", "dbo");
    });

产品;

Map(m =>
  {
    m.Properties(p => new
    {
      p.Name
    });
    m.ToTable("Products", "dbo");
  });

  Map(m =>
  {
    m.Properties(p => new
    {
      p.OrderingStatus
    });

    m.ToTable("OrdersProducts", "dbo");
  });

  HasRequired<Price>(x => x.Price)
    .WithMany()
    .Map(m => m.MapKey("PriceId"));

价格;

  ToTable("Prices", "dbo");

我无法在上下文中找到我的映射,有没有人可以帮助我朝正确的方向发展。

我实际上有两种麻烦,首先是将OrderingStatus映射到我的中间表,其次我连接我的表时遇到问题,即'指定的Schema无效。错误:...错误0019:i类型中的每个属性名称必须是唯一的。属性名称''OrdersProductsId'已经定义。'


1 个答案:

答案 0 :(得分:2)

您的映射不起作用 - 您无法将OrderingStatus映射到Prodcut,因为它不在同一个表中,并且与产品的一对一关系无关。它位于具有一对多关系的单独表中。您必须将OrdersProducts公开为单独的实体,因为您的联结表包含您要使用的其他属性:

public class Order
{
    [Key]
    public int OrderId { get; set; }
    public virtual ICollection<ProductOrder> ProductOrders { get; set; }
}

public calss ProductOrder
{
    [Key]
    public int OrderProductId { get; set; }
    public int OrderStatus { get; set; }
    public virtual Product { get; set; }
    public virtual Order { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    public virtual Price Price { get; set;}
}

public class Price
{
    [Key]
    public int PriceId { get; set;}
}