带有附加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,让Hardware/Entry ID成为外键,然后结束呢?
请记住,Key属性只需要用于标识特定表中的记录的字段(表的主键)。在多个字段上使用该属性将创建一个组合键(这就是您唯一约束的来源)。