我正在将项目转换为.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而不剥离主键?
答案 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
另一种方法是在保存更改之前通过代码设置密钥