【问题标题】:Entity Framework Code First Use foreign key as part of composite primary key实体框架代码优先使用外键作为复合主键的一部分
【发布时间】:2017-07-28 16:25:03
【问题描述】:

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

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

为了初始化 HourlySnapshots 表,我在 HourlySnapshot 对象中包含了一个常规的 Id 属性以用作主键。我想要做的是将 HourlySnapshots 表的主键从 Id 列切换到外键的组合(这是NameTeamId 的组合)和HourlySnapshot 的另一个属性叫Timestamp。换句话说,让它由NameTeamIdTimestamp 三列组成。

您能想出一种使用 Code First 的方法吗?我可以通过打开表定义并在那里进行编辑来轻松地做到这一点,但我想坚持 Code First 工作流程,以便迁移包含所有更改。

【问题讨论】:

  • 如果您包含您的模型代码,人们会更容易提供帮助。其次,surrogate keys 让这一切变得更容易。但是,如果您想要自然键,您可以通过annotationsfluently 在EF 中指定复合键。

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


【解决方案1】:

经过更多研究,我能够使用 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);
}

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2023-03-13
    • 2023-03-19
    相关资源
    最近更新 更多