【发布时间】:2021-10-01 02:19:45
【问题描述】:
有这两个实体:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public CompanyVehicle CompanyVehicle { get; set; }
}
和
public class CompanyVehicle
{
public int Id { get; set; }
public string Name { get; set; }
public Employee Employee { get; set; }
}
在SQL Server 2019 上使用Entity Framework Core 5.0.8,CompanyVehicle 的配置为:
entityBuilder.HasOne(t => t.Employee)
.WithOne(t => t.CompanyVehicle)
.HasForeignKey<Employee>(t => t.Id)
.IsRequired();
我们会尝试插入一些东西:
public void Create(Employee employee)
{
employee.CompanyVehicle = new CompanyVehicle();
dbContext.Add<Employee>(employee);
dbContext.SaveChanges();
}
上面的代码在EF6 中可以正常工作。 Employee 和 CompanyVehicle 表中的两条新记录是使用相同的 Id 创建的。迁移到EF Core 5.0.8后,dbContext.SaveChanges() 抛出异常:
System.InvalidOperationException: 'Employee.Id' 的值在尝试保存更改时未知。这是因为该属性也是关系中的主体实体未知的外键的一部分。'
请注意,这些实体只是示例,在我的情况下不应更改数据库设计。
更新
经过一番调查,我发现我的问题是:
将X(主体)和Y(从属)作为两个表,其中X.Id 是X 的PK 和Y.Id 是Y 的PK 和FK 到X,在EF Core 中有一条记录的X 无法插入。
【问题讨论】:
-
出于某种神秘的原因,在我的情况下,当我启动主键自动递增为 0 时,Entity Framework 出现问题。我还有一个既是主键又是外键的字段。这不是我第一次遇到这个问题,我通过从 1 开始索引来解决它。
IDENTITY(1,1)我不知道为什么... -
@A.Morel 在迁移之前尝试在启动时禁用所有 EF 约定,看看它是否适用于从 0 开始的增量。
-
我先使用数据库,但感谢您的提示。
标签: sql-server entity-framework-core ef-core-5.0