在Entity Framework 6中,如何使用另一侧的导航属性创建一对多映射?

时间:2017-07-28 03:40:48

标签: c# entity-framework-6

我的域模型是Trade可以有多个TradeLeg。我正在尝试使用以下映射。

贸易地图

HasKey(t => t.TradeId);
Property(t => t.TradeId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
     .HasColumnName("TradeId");                                      
Property(t => t.Description).HasColumnName("Description");
Property(t => t.CounterpartyId).HasColumnName("CounterpartyId");
Property(t => t.Quantity).HasColumnName("Quantity");
Property(t => t.IsActive).HasColumnName("IsActive");

HasMany(t => t.TradeLegs);

ToTable("Trade");

交易支柱映射

HasKey(t => t.TradeLegId);
Property(t => t.TradeLegId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
    .HasColumnName("TradeLegId");                                      
Property(t => t.TrdId).HasColumnName("TrdId"); // FK  back to trade
Property(t => t.Ordinal).HasColumnName("Ordinal");
Property(t => t.Description).HasColumnName("Description");

ToTable("TradeLeg");        

当我尝试选择某些交易时,我得到了Excpetion。

  

列名Trade_TradeId无效。

我可以通过在TradeLeg上添加导航属性来进行交易,并将.WithRequired(u => u.Trade).HasForeignKey(u =>u.TrdId)添加到HasMany()对象上的Trade映射中。

但是,我不希望TradeLeg上的导航属性返回Trade。我只想在TrdId上拥有一个int FK属性(TradeLeg)。我还注意到,如果我使用TradeId代替TrdId作为TradeLeg上的FK属性,它也会因默认规则而起作用。有没有办法告诉EF HasMany()另一边的FK字段的名称。

1 个答案:

答案 0 :(得分:1)

映射应该适用于使用Trade的{​​{1}}对象。像下面这样的东西应该有效。

HasMany()

我刚刚在我的一个映射对象上对EF6进行了测试,似乎可以正常工作。

如果您希望孩子在父母身上没有导航属性,例如

,那么同样的概念可以以另一种方式工作
HasMany(t => t.TradeLegs)
    .WithRequired() //use WithOptional for optional no need to specify the mapping on the other side.
    .HasForeignKey(leg => leg.TrdId);