使用Code First,我创建了一个代表Donor
的模型。我使用迁移生成一个表来存储所有Donor
个对象。我使用注释将主键指定为模型的两个属性Name
和TeamId
的组合。
我在名为HourlySnapshots
的模型中添加了一个导航属性,它是一个代表一对多关系的ICollection<HourlySnapshot>
。 (HourlySnapshot
是我创建的另一个域模型。)我运行了迁移,它生成了另一个表来存储所有HourlySnapshot
个对象。正如预期的那样,它在我的模型中添加了两列,用于存储由Name
和TeamId
组成的外键。
为了初始化HourlySnapshots表,我在Id
对象中包含了一个传统的HourlySnapshot
属性,用作主键。我尝试做的是将HourlySnapshots表的主键从Id
列切换到外键的组合(由Name
和TeamId
组合而成)HourlySnapshot
的另一个属性Timestamp
。换句话说,将其组合为三列Name
,TeamId
和Timestamp
。
你能想到使用Code First做到这一点的方法吗?我可以通过打开表定义并在那里进行编辑来轻松完成此操作,但我希望遵循Code First工作流程,以便迁移包括所有更改。
答案 0 :(得分:0)
经过一些研究后,我能够使用Fluent API实现这一目标。我不认为使用注释或约定是可能的。以下是我在ApplicationDBContext
课程中的最终结果...
public DbSet<Donor> Donors { get; set; }
public DbSet<HourlySnapshot> HourlySnapshots { get; set; }
public DbSet<DailySnapshot> DailySnapshots { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Donor>()
.HasKey(d => new { d.Name, d.TeamId });
modelBuilder.Entity<HourlySnapshot>()
.HasKey(s => new { s.Name, s.TeamId, s.Timestamp });
modelBuilder.Entity<Donor>()
.HasMany(d => d.HourlySnapshots)
.WithOptional()
.HasForeignKey(s => new { s.Name, s.TeamId });
modelBuilder.Entity<DailySnapshot>()
.HasKey(s => new { s.Name, s.TeamId, s.TimeStamp });
modelBuilder.Entity<Donor>()
.HasMany(d => d.DailySnapshots)
.WithOptional()
.HasForeignKey(s => new { s.Name, s.TeamId });
base.OnModelCreating(modelBuilder);
}