对此问题的解释很可能如下:
您在实体中定义复合主键的方法不正确。使用您当前的型号EF只考虑 ZoneMapping.PostcodeKey 作为主键。有关此问题的更多信息以及如何解决此问题。
ZoneMapping.PostcodeKey
你弄错了 result 在相应的上下文已包含实体的情况下 PostcodeKey == "2214" 和 Zone_ID == 256 之前 你运行你的查询。 (我猜你从来没有错过 result2 。)当EF从数据库加载实体时,如果上下文中已经存在具有相同键的实体,它总是查看查询。如果是,则查询的实体被丢弃,而是将附加的实体添加到结果集合中。在你的情况下,你正在查询 PostcodeKey == "2214" 和 Zone_ID == 257 。查询后,EF从结果行中选择主键的值。但是因为EF“认为”只有主键 PostcodeKey == "2214" 它搜索具有该键值的附加实体并查找实体 PostcodeKey == "2214" 但是 Zone_ID == 256 并将结果返回给您。你永远不会遇到这个问题 result2 因为相应的上下文是new和empty,所以EF将返回刚刚加载的结果,而不是任何旧的附加实体。
result
PostcodeKey == "2214"
Zone_ID == 256
result2
Zone_ID == 257
如果要定义复合键,则必须具有两个关键部分的标量属性。你不能使用像这样的导航属性 ZoneMapping.Zone 作为关键部分。这意味着您必须拥有列的属性 Zone_ID 在模型类中(除了导航属性) Zone ):
ZoneMapping.Zone
Zone_ID
Zone
public class ZoneMapping { public String PostcodeKey { get; set; } public int Zone_ID { get; set; } public Zone Zone { get; set; } }
然后,为了定义带有数据注释的复合键,您必须使用 Column(Order = n) 已经在@Jonas J?mtberg的回答中显示了属性。你也应该申请 ForeignKey 属性为 Zone_ID 因为下划线使属性名称为“非常规”,因此EF不会按惯例将其检测为FK:
Column(Order = n)
ForeignKey
public class ZoneMapping { [Key, Column(Order = 0)] public String PostcodeKey { get; set; } [Key, ForeignKey("Zone"), Column(Order = 1)] public int Zone_ID { get; set; } public Zone Zone { get; set; } }
EF使用此映射生成的迁移类应具有如下所示的主键定义:
.PrimaryKey(t => new { t.PostcodeKey, t.Zone_ID })
...不喜欢 .PrimaryKey(t => t.PostcodeKey).PrimaryKey(t => t.Zone_ID) 您尝试修复此问题但未成功。
.PrimaryKey(t => t.PostcodeKey).PrimaryKey(t => t.Zone_ID)