实体框架代码首先使用外键作为复合主键的一部分

时间:2017-07-28 16:25:03

标签: ef-code-first foreign-keys ef-migrations

使用Code First,我创建了一个代表Donor的模型。我使用迁移生成一个表来存储所有Donor个对象。我使用注释将主键指定为模型的两个属性NameTeamId的组合。

我在名为HourlySnapshots的模型中添加了一个导航属性,它是一个代表一对多关系的ICollection<HourlySnapshot>。 (HourlySnapshot是我创建的另一个域模型。)我运行了迁移,它生成了另一个表来存储所有HourlySnapshot个对象。正如预期的那样,它在我的模型中添加了两列,用于存储由NameTeamId组成的外键。

为了初始化HourlySnapshots表,我在Id对象中包含了一个传统的HourlySnapshot属性,用作主键。我尝试做的是将HourlySnapshots表的主键从Id列切换到外键的组合(由NameTeamId组合而成)HourlySnapshot的另一个属性Timestamp。换句话说,将其组合为三列NameTeamIdTimestamp

你能想到使用Code First做到这一点的方法吗?我可以通过打开表定义并在那里进行编辑来轻松完成此操作,但我希望遵循Code First工作流程,以便迁移包括所有更改。

1 个答案:

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