我希望在Entity Framework中创建Currency
和CrossRates
。
从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 :(得分: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 });