从一对多关系实体框架中的父集合中删除时删除子实体

时间:2015-12-18 08:52:45

标签: entity-framework one-to-many foreign-key-relationship

我有以下数据库设置: enter image description here

表格映射如下:

public class OrderMapping : EntityTypeConfiguration<Order>
{
    public OrderMapping()
    {
        this.ToTable("Orders", "prf");

        this.HasKey(o => o.OrderId);

        this.HasMany(o => o.OrderItems)
            .WithRequired(oi => oi.Order)
            .HasForeignKey(oi => oi.OrderId);

        this.HasRequired(o => o.Institution)
            .WithMany()
            .HasForeignKey(o => o.InstitutionId);

        this.Property(o => o.IsConfirmed)
            .IsRequired();

        this.Ignore(o => o.Id);
    }
}

public class OrderItemMapping : EntityTypeConfiguration<OrderItem>
{
    public OrderItemMapping()
    {
        this.ToTable("OrderItems", "prf");

        this.HasKey(oi => oi.OrderItemId);

        this.HasRequired(oi => oi.Order)
            .WithMany(oi => oi.OrderItems)
            .HasForeignKey(oi => oi.OrderId);

        this.HasRequired(oi => oi.Proficiency)
            .WithMany()
            .HasForeignKey(oi => oi.ProficiencyId);

        this.HasOptional(oi => oi.Enrolment)
            .WithMany()
            .HasForeignKey(oi => oi.EnrolmentId);

        this.HasMany(oi => oi.OrderItemSets)
            .WithRequired(ois => ois.OrderItem)
            .HasForeignKey(ois => ois.OrderItemId);

        this.Property(oi => oi.DateCreated);

        this.Ignore(oi => oi.Id);
    }
}

public class OrderItemSetMapping : EntityTypeConfiguration<OrderItemSet>
{
    public OrderItemSetMapping()
    {
        this.ToTable("OrderItemSets", "prf");

        this.HasKey(ois => ois.OrderItemSetId);

        this.HasRequired(ois => ois.OrderItem)
            .WithMany(ois => ois.OrderItemSets)
            .HasForeignKey(ois => ois.OrderItemId);

        this.Property(ois => ois.NumberOfSets);
        this.Property(ois => ois.Month);
    }
}

当我尝试从OrderItem的集合中删除OrderItemSet时,实体框架尝试将OrderItemSet中的外键设置为null而不是删除该行,即使外键不可为空,因此抛出一个说明外键的异常不能设置为null。

this.OrderItemSets.Remove(orderItemSet);

我不知道我的映射有什么问题让Entity Framework认为它应该将foreignkey设置为null而不是删除该行。

2 个答案:

答案 0 :(得分:3)

您需要的是OderItemOrderItemSet之间的identifying relationship。从上面提供的链接识别和非识别关系的注意事项部分开始:

  

删除关系会删除依赖对象。在EntityCollection上调用Remove方法标记关系和要删除的依赖对象。

您应该考虑OrderOrderItem的相同类型的关系。

基本思路是,对于OrderItemSet的模型,您将外键设为OrderItem主键的OrderItemSet部分,从而创建< em>复合键。在OrderItemSet的映射内部尝试映射主键,如下所示:

public OrderItemSetMapping()
{
    ...

    this.HasKey(ois => new { ois.OrderItemSetId, ois.OrderItemId });

    ...
}

如果是doesn't work with the fluent API,则尝试使用属性创建映射:

public class OrderItemSet
{
    [Key, ForeignKey("OrderItem"), Column(Order = 1)]
    public <YourKeyType> OrderItemId { get; set; }

    [Key, Column(Order = 2)]
    public <YourKeyType> OrderItemSetId { get; set; }

    ...
}

答案 1 :(得分:0)

为什么不直接删除孩子:

context.OrderItemSets.Remove(orderItemSet);
context.SaveChanges();

从父项中删除子项时,您可能希望将其添加到另一个父项,因此实体框架自动删除子项是不合适的。你应该自己做。