2017-07-28 89 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); 
} 
相關問題