带有附加Id的EF连接表在保存时抛出异常

本文关键字:保存 抛出异常 连接 EF Id | 更新日期: 2023-09-27 18:14:04

这个问题和我原来的问题有关。

我得到了它的工作,这是很好的,但几秒钟前,我注意到它不是100%的我所期望的。

public class Entry{
    public IEnumerable<EntryHardware> RequestedHardware {get; set;}
}
public class EntryHardware{
    [Key]
    [Column(Order=0)]
    public int EntryId {get; set;}
    [Key]
    [Column(Order=1)]
    public int HardwareId {get; set;}
    public AdditionalProperty Foo {get; set;}
}
public class Hardware{
    public string Name {get; set;}
}

使用这种方法,一个条目可以包含n 个不同的硬件,但添加相同的硬件两次将导致一个不唯一的id集。

为了解决这个问题,我在我的EntryHardware Model中添加了一个新的唯一属性:

public class EntryHardware{
    [Key]
    [Column(Order=0)]
    public int Id {get; set;}
    [Key]
    [Column(Order=1)]
    public int EntryId {get; set;}
    [Key]
    [Column(Order=2)]
    public int HardwareId {get; set;}
    public AdditionalProperty Foo {get; set;}
    public virtual Entry ...
    public virtual Hardware ...
}

不幸的是,这样Id属性不会通过DB自动设置。在寻找答案时,我发现了一个应该解决这个问题的属性:

public class EntryHardware{
    [Key]
    [Column(Order=0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
    [Key]
    [Column(Order=1)]
    public int EntryId {get; set;}
    [Key]
    [Column(Order=2)]
    public int HardwareId {get; set;}
    public AdditionalProperty Foo {get; set;}
    public virtual Entry ...
    public virtual Hardware ...
}

但是使用这个我的代码抛出一个异常,当它涉及到保存实体到DB:

存储更新、插入或删除语句影响了意外的行数(0)。实体可能在加载后被修改或删除。

但是我不知道问题出在哪里....

带有附加Id的EF连接表在保存时抛出异常

[从评论中提升]

停下来后退一步....你想达到什么目标?

为什么不给连接表一个自己的(无意义的)ID,让Hardware/Entry ID成为外键,然后结束呢?

请记住,Key属性只需要用于标识特定表中的记录的字段(表的主键)。在多个字段上使用该属性将创建一个组合键(这就是您唯一约束的来源)。