实体框架 - 关系

时间:2015-05-15 10:11:11

标签: c# entity-framework

我希望在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;}

  }

2 个答案:

答案 0 :(得分: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更好。

答案 1 :(得分:0)

我认为您需要创建两个一对多关系,因此Currency必须有两个CrossRate集合。您不能拥有两个FK引用的单个集合,除非另一个实体的PK是复合的(如此post),但Currency只有一个PK。试试这个型号:

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 });