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)]
键的属性 属性。
但您必须确保您使用的数据库提供程序支持此属性。
我正在将我的项目转换为 .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)]
键的属性 属性。
但您必须确保您使用的数据库提供程序支持此属性。