2016-09-06 64 views
0

我使用實體框架核心與ASP.NET核心以代碼優先的方法。 這是簡化版本。我有兩個實體Store和Shift。 Shift是獨立實體,Store和Shift之間有許多關係。爲依賴實體(實體框架核心)的身份屬性生成非唯一值

實體店:

public partial class Store 
    { 
     [Display(Name = "Store Id")] 
     public int Id { get; set; } 
     [Display(Name = "Store Name")] 
     public string Name { get; set; } 
     public virtual ICollection<Shift> Shifts { get; set; } = new HashSet<Shift>(); 
} 

轉變對實體

public partial class Shift 
    { 
public int Id { get; set; } 
public int StoreId { get; set; } 
[Display(Name = "Start Time")] 
public TimeSpan? StartTime { get; set; } 
public virtual GasStation GasStation { get; set; } 
} 

以下是的DbContext流暢API配置

modelBuilder.Entity<Shift>().Property(t => t.StoreId) 
    .ValueGeneratedNever().IsRequired(); 

modelBuilder.Entity<Shift>().Property(t => t.Id).ValueGeneratedOnAdd().IsRequired(); 

modelBuilder.Entity<Shift>() 
.HasKey(k => new { k.GasStationId, k.Id }); 

情景和目標 我想實現以下目標。商店實體可以有多個班次,班次編號在創建班次記錄時被分配(Id的標識列)。

  • 商店1:假設我爲商店1創建了第一班。數據庫分配的班次ID爲1.如果我爲商店1創建另一個班次,則Shift Id被指定爲2。太好了。
  • 店鋪2:現在店鋪2,當我創建第一個轉變的ID分配給值3 我希望它有分配到1的ID值

只要我想要的對於每個商店記錄,Shift的Id從1開始。 我該如何做到這一點? 在此先感謝您的幫助。

回答

0

標識列必須包含唯一值。因此,不可能多次將相同的值分配給Shift的主要Id。

你可以做的是使用複合鍵代替Shift的主鍵。

引入一個新的ShiftNumber列。然後使用此列+ Store作爲組合鍵的ID(How do I map a composite primary key in Entity Framework 4 code first?)。

+0

@George感謝您的回覆。我已經在做你所建議的了。如果你看最後一行,我設置了複合關鍵字modelBuilder.Entity () .HasKey(k => new {k.GasStationId,k.Id}); –

+0

對不起,在最後一個代碼行中有一個類型,它應該如下'modelBuilder.Entity () .HasKey(k => new {k.StoreId,k.Id});' –