2017-07-28 86 views
0

使用代码首先,我创建了一个代表Donor的模型。我使用迁移来生成一个表来存储所有Donor对象。我使用注释来指定主键为我的模型的两个属性NameTeamId的组合。实体框架代码首先使用外键作为复合主键的一部分

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

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

您能想到一种与Code First做到这一点的方法吗?我可以轻松地通过打开表格定义并在那里编辑,但我想遵守Code First工作流程,以便迁移包括所有更改。

+0

如果包含模型代码,人们更容易协助。其次,[代理键](https://en.wikipedia.org/wiki/Surrogate_key)使这更容易。但是,如果你想要自然键,你可以通过[注释](https://msdn.microsoft.com/en-us/library/jj591583(v = vs.113).aspx)或[流利地]( https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx)。 –

回答

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); 
} 
相关问题