EF Core 未传入主键进行查询

EF Core not passing in primary key to query

我正在将我的项目转换为 .NET Core(和 EF Core)。

当我调用 SaveChanges 时,我可以看到我的实体被列为修改后的实体(待插入)。并将主键列为设置值。

但是当我查看它输出的 SQL 时,它设置的属性中没有列出主键。

这是我的实体的示例:

[Table("Bag", Schema = "Shipment")]
public partial class Bag
{
    [Key]
    [StringLength(11)]
    public string BagNumber { get; set; }
    [ForeignKey("Box")]
    public long BoxId { get; set; }
    public virtual Box Box { get; set; }
    public bool IsOpened { get; set; }
    // ... More stuff below

Entity Framework 核心从插入中创建一个合并语句。正如我上面所说,它在查询中没有我的主键(在本例中为 BagNumber)。

我认为 .NET Core 可能假设所有密钥都是在数据库上自动生成的。为了测试这一点,我尝试在键上设置 [DatabaseGenerated(DatabaseGeneratedOption.None)] 。但这给了我关于为我的密钥使用临时值的错误(不确定那是什么)。

我通过覆盖 SaveChanges 并遍历添加和修改的实体来验证 SaveChanges 正在获取主键 (BagNumber)。

不确定还可以尝试什么。 (注意:这一切在 Entity Framework 6 中运行良好。)

如何让 Entity Framework Core 不删除我的主键?

您没有正确定义实体中的键。如果要通过sql服务器设置身份,属性类型必须是数字

public class Bag
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int BagNumber { get; set; }

[ForeignKey("BoxId")]
public virtual Box Box { get; set; }
public long BoxId { get; set; }

public bool IsOpened { get; set; }
// ... More stuff below

另一种方法是在保存更改之前通过代码设置密钥

EF 核心默认使用自动生成(自动增量)字段作为主键。如果你想改变这种行为,你可以使用

[DatabaseGenerated(DatabaseGeneratedOption.None)][DatabaseGenerated(DatabaseGeneratedOption.Identity)][DatabaseGenerated(DatabaseGeneratedOption.Computed)]

键的属性 属性。

但您必须确保您使用的数据库提供程序支持此属性。