在一对多关系实体框架中从导航属性中删除对象时获取异常

时间:2014-02-16 07:49:44

标签: c# sql entity-framework

我在项目中首先使用EF代码。 POCO课程和流利的api如下:

POCO课程

public class Tenant
{
  public int TenantId { get; set; }

  public virtual ICollection<Service> Services { get; set; }
} 

public class Service
{
  public int ServiceId { get; set; }

  public int TenantId { get; set; }
  public virtual Tenant Tenant { get; set; }
} 

流利的Api

   modelBuilder.Entity<Tenant>()
               .HasMany(p => p.Services)
               .WithRequired(p => p.Tenant)
               .HasForeignKey(p => p.TenantId)
               .WillCascadeOnDelete(false);

租户与服务之间的关系是1到多个双向。当我试图从这样的服务列表中删除服务时:

  tenantProvider.Tenant.Services.Remove(service);

我遇到了这个例外:

  

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

任何人都可以请我出去告诉我我做错了什么?  (由于我的架构中的其他关系和多个级联路径,我必须设置级联删除false)

修改

@Kirill Bestemyanov 给出的答案解决了我的问题,现在我可以从 Service 表中成功删除该服务。但是当我试图从 Tenant 实体的 Services 导航属性中删除服务时,我仍然不明白为什么我得到了上述异常。谁能请你简单解释一下?

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该删除服务而不是从导航属性集中删除它:

tenantProvider.Set<Service>.Remove(service);

<强>更新

tenantProvider.Tenant.Services.Remove(service);从导航属性集合中删除您的服务实体,但不从db中删除此实体。它删除链接(即外键值)。