2015-05-15 169 views
1

我期待在Entity Framework中创建CurrencyCrossRates实体框架 - 关系

从SQL角度来看,CrossRates表格会很简单。

Date  |FromCurrency|ToCurrency|Rate 
01/01/2000|USD   |EUR  |1.5 
01/01/2000|EUR   |USD  |0.67 

如何将上述想法应用到实体框架中?

这里是我迄今为止...

public class Currency 
    { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    //navigation 
    public virtual List<CrossRate> CrossRates { get; set; } 
    } 

    public class CrossRate 
    { 
     public int FromCurrencyId {get;set;} 
     public int ToCurrencyId {get;set;} 
     public DateTime Date {get;set;} 
     public decimal Rate {get;set;} 

    } 

回答

0

我认为你需要创建两个一对多的关系,所以Currency必须有两个集合CrossRate。除非另一个实体的PK是合成的(例如在此post中),但Currency只有一个PK,您不能拥有由两个FK引用的单个集合。尝试用这种模式:

public class Currency 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    //navigation prop, these are the CrossRates where this Currency was used as a From 
    public virtual ICollection<CrossRate> FromCrossRates { get; set; } 

    //navigation prop, these are the CrossRates where this Currency was used as a To 
    public virtual ICollection<CrossRate> ToCrossRates { get; set; } 
} 

public class CrossRate 
{ 
    public int FromCurrencyId { get; set; } 
    public int ToCurrencyId { get; set; } 

    public DateTime Date { get; set; } 
    public decimal Rate { get; set; } 

    public Currency FromCurrency { get; set; } 

    public Currency ToCurrency { get; set; } 
} 

而且关系的配置将是:

 //composite PKs of CroassRate entity 
     modelBuilder.Entity<CrossRate>().HasKey(cr => new {cr.FromCurrencyId, cr.ToCurrencyId}); 

     //one-to-many 
     modelBuilder.Entity<CrossRate>() 
        .HasRequired(s => s.FromCurrency) 
        .WithMany(s => s.FromCrossRates) 
        .HasForeignKey(s => new { s.FromCurrencyId }); 

     modelBuilder.Entity<CrossRate>() 
        .HasRequired(s => s.ToCurrency) 
        .WithMany(s => s.ToCrossRates) 
        .HasForeignKey(s => new { s.ToCurrencyId }); 
0

您可以覆盖范围内的OnModelCreating()方法来定义关系。参见教程http://www.entityframeworktutorial.net/

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     //one-to-many 
     modelBuilder.Entity<CrossRate>() 
        .HasRequired<Currency>(s => s.FromCurrency) 
        .WithMany(s => s.CrossRates) 
        .HasForeignKey(s => s.FromCurrencyId); 

     modelBuilder.Entity<CrossRate>() 
        .HasRequired<Currency>(s => s.ToCurrency) 
        .WithMany(s => s.CrossRates) 
        .HasForeignKey(s => s.ToCurrencyId); 
} 

您还应该添加

public Currency ToCurrecy{get;set;} 
    public Currency FromCurrecy{get;set;} 

您CrossRate类。对于关系,ICollection比List更好。

+0

已经对货币类CrossRate增加。然而VS抱怨s.Casic在“.HasRequired (s => s.Currency)” –

+0

对不起,我编辑了答案 – scokmen

+0

似乎更好。然而,VS现在抱怨“EntityType'CrossRate'没有定义键。定义此EntityType的密钥“ –