我在项目中首先使用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 导航属性中删除服务时,我仍然不明白为什么我得到了上述异常。谁能请你简单解释一下?
谢谢!
答案 0 :(得分:2)
您应该删除服务而不是从导航属性集中删除它:
tenantProvider.Set<Service>.Remove(service);
<强>更新强>
tenantProvider.Tenant.Services.Remove(service);
从导航属性集合中删除您的服务实体,但不从db中删除此实体。它删除链接(即外键值)。