表格映射如下:
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而不是删除该行。
答案 0 :(得分:3)
您需要的是OderItem
和OrderItemSet
之间的identifying relationship。从上面提供的链接识别和非识别关系的注意事项部分开始:
删除关系会删除依赖对象。在EntityCollection上调用Remove方法标记关系和要删除的依赖对象。
您应该考虑Order
和OrderItem
的相同类型的关系。
基本思路是,对于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();
从父项中删除子项时,您可能希望将其添加到另一个父项,因此实体框架自动删除子项是不合适的。你应该自己做。