EF - 设置Identity不是主键,然后在另一个表中用作外键

时间:2017-12-29 07:53:31

标签: sql entity-framework

是否有可能建立如下的关系?

或者最好的方法是什么?

我有一个父表SnapShotPriceList,其中包含一个复合键(使用外键构建),它们在此表中提供了唯一的记录。

我想创建子表SnapPriceListProcess并与父表建立关系,而不是使用这个复杂的键,而是使用一些唯一的列。这有意义吗?我可以这样做吗?添加SnapPricelistId? 非常感谢任何提示。

[Table("SnapShotPriceList")]
public class SnapShotPriceList
{
    // auton increment but not primary key
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SnapPriceListId { get; set; }

    [Key, Column("ProjectId", Order = 0)]
    public int ProjectId { get; set; }

    [Key, Column("PriceListId", Order = 1)]
    public int PriceListId { get; set; }

    public int CrtUsrnm { get; set; }
    public DateTime CrtTmstmp { get; set; }

    [ForeignKey("PriceListId")]
    public virtual PriceList PriceList { get; set; }
    [ForeignKey("PriceListId, ProjectId")]
    public virtual ProjectPriceList ProjectPriceList { get; set; }

    public ICollection<SnapShotPriceListProcess> SnapShotPriceListProcesses { get; set; }
}

[Table("SnapPriceListProcess")]
public class SnapShotPriceListProcess
{
    [Key, Column("SnapProcessId", Order = 0)]
    public int SnapProcessId { get; set; }

    [ForeignKey("SnapPriceListId")]
    public virtual SnapShotPriceList SnapShotPriceList{ get; set; }

    // some other fields
}

1 个答案:

答案 0 :(得分:0)

EF6不支持引用备用密钥的外键。 EF Core确实(https://docs.microsoft.com/en-us/ef/core/modeling/alternate-keys)但有其他限制。

但为此引入一个新密钥通常是一个坏主意。复合键通常更有效,因为“子”行将存储在一起。