【问题标题】:Generating non unique value for Identity Property of depend entity (Entity Framework Core)为依赖实体的身份属性生成非唯一值(实体框架核心)
【发布时间】:2017-01-14 01:15:17
【问题描述】:

我正在使用带有代码优先方法的 ASP.NET Core 的 Entity Framework 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>();
}

转变实体

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 中的 fluent 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 });

场景和目标 我想实现以下目标。一个商店实体可以有许多班次,班次编号在创建班次记录时分配(Identity 列用于 Id)。

  • 商店 1:假设我为商店 1 创建了第一个班次。由数据库分配的班次 ID 为 1。如果我为商店 1 创建另一个班次,则班次 ID 被分配为 2。到目前为止一切顺利。
  • 商店 2:现在对于商店 2,当我创建第一个班次时,ID 被分配给值 3。我希望它的 ID 值被分配给 1。

我只是希望每个商店记录的 Shift 的 ID 从 1 开始。 我怎样才能做到这一点? 提前感谢您的帮助。

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

    标识列必须包含唯一值。因此,不能多次为 Shift 的 Primary Id 分配相同的值。

    您可以做的是使用复合键而不是 Shift 的主键。

    引入一个新列 ShiftNumber。然后使用该列+Store的id作为组合键(How do I map a composite primary key in Entity Framework 4 code first?)。

    【讨论】:

    • @George 感谢您的回复。我已经在做你建议的事情了。如果您查看最后一行,我正在设置复合键 modelBuilder.Entity() .HasKey(k => new { k.GasStationId, k.Id });
    • 抱歉最后一行代码中有一个类型,应该如下 'modelBuilder.Entity() .HasKey(k => new { k.StoreId, k.Id }); '
    猜你喜欢
    • 2017-08-09
    • 2016-11-08
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多