EF Core未将主键传递给查询

时间:2019-12-04 00:56:45

标签: asp.net-core entity-framework-core asp.net-core-webapi entity-framework-core-2.2

我正在将项目转换为.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 Core在插入中做出合并语句。就像我上面说的,它在查询中没有主键(在本例中为BagNumber)。

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

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

不确定其他尝试方法。 (注意:这一切在Entity Framework 6中都可以正常工作。)

如何获取Entity Framework Core而不剥离主键?

2 个答案:

答案 0 :(得分:0)

默认情况下,EF核心使用自动生成的(自动增量)字段作为主键。如果要更改此行为,可以使用 关键属性的[DatabaseGenerated(DatabaseGeneratedOption.None)][DatabaseGenerated(DatabaseGeneratedOption.Identity)][DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性。

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

答案 1 :(得分:-1)

您在实体中没有正确的键定义。如果要通过SQL Server设置身份,则属性类型必须为数字

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

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