为导航属性Id插入父ID的实体框架

时间:2015-11-30 19:55:20

标签: c# entity-framework

我有一个与另一个人有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,以及子表中指向父表的PurchaseOrderIdPurchaseOrder)。

父类(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数据库没有引用AckExceptionAckException有一个PurchaseOrderId列。

2 个答案:

答案 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);