我有一个与另一个人有1-0..1关系的班级。这两个是彼此的导航属性。 Id
列应该由DB填充,但EF 6正在尝试将父{的Id
作为子导航属性的Id传递。我不知道为什么会这样。具体错误为Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
当进行实际的context.SaveChanges()
调用时,导航属性的Id
应该是0
。我使用SQL Server Profiler进行检查,而DB的INSERT语句正在尝试插入父级的Id。
如何修复此问题,以便EF不会尝试使用父级的Id作为导航属性的新ID?
出于这个问题的目的,父和子都可以假设在数据库中只有一列Id
,以及子表中指向父表的PurchaseOrderId
( PurchaseOrder
)。
父类(BaseEntity
包含Id
属性):
public partial class PurchaseOrder : BaseEntity
{
// misc properties
public virtual AckException AckException { get; set; }
}
儿童班:
public partial class AckException : BaseEntity
{
// misc properties
public virtual int PurchaseOrderId { get; set; }
public virtual PurchaseOrder PurchaseOrder { get; set; }
}
父映射(PurchaseOrder
)中没有任何内容以任何方式引用子(AckException
)。
子映射:
public AckExceptionMap()
{
ToTable("AckException");
HasKey(c => c.Id);
// misc properties
Property(u => u.PurchaseOrderId).IsRequired();
HasRequired(ex => ex.PurchaseOrder)
.WithOptional(p => p.AckException);
}
PurchaseOrder
数据库没有引用AckException
。 AckException
有一个PurchaseOrderId
列。
答案 0 :(得分:1)
您不需要在AckException对象中指定FK,从该对象中删除PurchaseOrderId
相反,你应该做
HasRequired(ex=>ex.PurchaseOrder).WithOptional(p=>p.AckException).Map(a => a.MapKey("PurchaseOrderId"));
EF会自动在表格中创建一个FK
答案 1 :(得分:1)
在您的示例中(外键关联与上面的示例独立关联),您需要在模型或流畅的api中映射外键。
1)型号:
[ForeignKey("PurchaseOrderId")
public virtual PurchaseOrder PurchaseOrder { get; set; }
2)流利的api:
HasRequired(ex => ex.PurchaseOrder)
.WithOptional(p => p.AckException)
.HasForeignKey(p => p.PurchaseOrderId);