为依赖实体(实体框架核心)的标识属性生成非唯一值



我使用实体框架核心与ASP。. NET Core采用代码优先的方法。下面是简化版。我有两个实体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>();
}

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

场景与目标我想实现以下目标。一个Store实体可以有多个班次,班次号是在创建班次记录时分配的(Id的Identity列)。

  • Store 1:假设我为Store 1创建了第一个移位。数据库将分配的Shift Id为1。如果我为存储1创建另一个移位,则移位Id被分配为2。到目前为止一切顺利。
  • Store 2:现在对于Store 2,当我创建第一个移位时,Id被分配给值3。我希望它有Id值分配给1。

简单地说,我想要每个存储记录的Shift的Id从1开始。我怎样才能做到呢?谢谢你的帮助。

标识列必须包含唯一的值。因此,不可能将相同的值赋给Shift的Primary Id多次。

你能做的是使用组合键来代替主键。

引入一个新的列ShiftNumber。然后使用此列+ Store的id作为复合键(我如何首先在实体框架4代码中映射复合主键?)。

最新更新