2011-04-09 83 views
0

我有以下表,EF 4.1流利API分贝第一关系映射问题

  1. 产品(pro_iIDX [PK],pro_sName)
  2. 制造商(man_iIDX [PK],man_sName)
  3. ProductManufacturer( pma_iIDX [PK],pma_iProductRef [FK],pma_iManufacturerRef [FK],pma_bAvailable)

我有以下波苏斯,

public class ProductInfo 
{ 
    public int IDX { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ProductManufacturerInfo> C0ProductManufacturers 
     { get; set; } 
} 

public class ManufacturerInfo 
{ 
    public int IDX { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ProductManufacturerInfo> C0ProductManufacturers 
     { get; set; } 
} 

public class ProductManufacturerInfo 
{ 
    public int IDX { get; set; } 
    public bool Available { get; set; } 

    public virtual ManufacturerInfo C0Manufacturer { get; set; } 
    public virtual ProductInfo C0ProductInfo { get; set; } 
} 

我已经使用没有成功以下映射,

public ProductManufacturerConfiguration() 
{ 
    ToTable("ProductManufacturer"); 
    HasKey(p => p.IDX); 
    Property(p => p.IDX).HasColumnName("pma_iIDX"); 
    Property(p => p.Available).HasColumnName("pma_bAvailable"); 
    Property(p => p.ProductRef).HasColumnName("pma_iProductRef"); 
    Property(p => p.ManufacturerRef).HasColumnName("pma_iManufacturerRef"); 

    //I have tried 
    HasRequired(p => p.ManufacturerInfo) 
      .WithMany(c => c.C0ProductManufacturers) 
      .Map(m => m.MapKey("pma_iManufacturerRef")); 
    HasRequired(p => p.ProductInfo) 
      .WithMany(c => c.C0ProductManufacturers) 
      .Map(m => m.MapKey("pma_iProductRef")); 

    //As well as 
    HasRequired(p => p.C0Manufacturer) 
      .WithMany(c => c.C0ProductManufacturers) 
      .HasForeignKey(p => p.ManufacturerRef); 
    HasRequired(p => p.C0Product) 
      .WithMany(c => c.C0ProductManufacturers) 
      .HasForeignKey(p => p.C0Product); 
} 

从我的考验,dB一抱怨找不到ManufacturerInfo_IDX当我执行以下,

var query = from p in _context.Product 
    select p; 

如果我第一次去的代码路线,将创建以下表,

ProductManufacturer(
      pma_iIDX[PK], 
      pma_iProductRef, 
      pma_iManufacturerRef, 
      pma_bAvailable, 
      ManufacturerInfo_IDX, 
      ProductInfo_IDX) 

任何援助将是非常的应用reciated。

+1

什么代码,当你有例外,你真正执行?你的'ProductManufacturerConfiguration'甚至不能用你上面提供的POCO类来编译。你能编辑你的问题,以明确什么是没有工作的代码? – Slauma 2011-04-09 15:58:48

回答

0

主要问题是您的ProductManufacturerInfo密钥不应该是IDX。 IDX在多对多关联中更像是“有效载荷”。解决这个问题的一个方法是指定一个真正的键,然后映射很简单:

public class ProductManufacturerInfo 
{ 
    public int IDX { get; set; } 
    public bool Available { get; set; } 

    public int C0ManufacturerIDX { get; set; } 
    public virtual ManufacturerInfo C0Manufacturer { get; set; } 

    public int C0ProductInfoIDX { get; set; } 
    public virtual ProductInfo C0ProductInfo { get; set; } 
} 

那么你的映射:

public class ProductManufacturerConfiguration 
    : EntityTypeConfiguration<ProductManufacturerInfo> 
{ 
    public ProductManufacturerConfiguration() 
    { 
     ToTable("ProductManufacturer"); 
     HasKey(p => new { p.C0ManufacturerIDX, p.C0ProductInfoIDX }); 
     Property(p => p.IDX) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    } 
} 
1

我很难相信,您提供的样本是你真正的代码,因为它甚至不编译。难以复制真实的代码来显示问题吗?

这工作:

public class ProductInfo 
{ 
    public int IDX { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ProductManufacturerInfo> C0ProductManufacturers 
    { get; set; } 
} 

public class ManufacturerInfo 
{ 
    public int IDX { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ProductManufacturerInfo> C0ProductManufacturers 
    { get; set; } 
} 

public class ProductManufacturerInfo 
{ 
    public int IDX { get; set; } 
    public bool Available { get; set; } 

    public int ManufacturerRef { get; set; }   
    public virtual ManufacturerInfo C0Manufacturer { get; set; } 

    public int ProductRef { get; set; } 
    public virtual ProductInfo C0ProductInfo { get; set; } 
} 

public class ProductManufacturerConfiguration : EntityTypeConfiguration<ProductManufacturerInfo> 
{ 
    public ProductManufacturerConfiguration() 
    { 
     ToTable("ProductManufacturer"); 
     HasKey(p => p.IDX); 
     Property(p => p.IDX).HasColumnName("pma_iIDX"); 
     Property(p => p.Available).HasColumnName("pma_bAvailable"); 
     Property(p => p.ProductRef).HasColumnName("pma_iProductRef"); 
     Property(p => p.ManufacturerRef).HasColumnName("pma_iManufacturerRef"); 

     //I have tried 
     HasRequired(p => p.C0Manufacturer) 
       .WithMany(c => c.C0ProductManufacturers) 
       .Map(m => m.MapKey("pma_iManufacturerRef")); 
     HasRequired(p => p.C0ProductInfo) 
       .WithMany(c => c.C0ProductManufacturers) 
       .Map(m => m.MapKey("pma_iProductRef")); 

     //As well as 
     HasRequired(p => p.C0Manufacturer) 
       .WithMany(c => c.C0ProductManufacturers) 
       .HasForeignKey(p => p.ManufacturerRef); 
     HasRequired(p => p.C0ProductInfo) 
       .WithMany(c => c.C0ProductManufacturers) 
       .HasForeignKey(p => p.ProductRef); 
    } 
}