无法删除实体 - 操作失败:由于一个关系无法更改

时间:2014-02-14 12:44:49

标签: c# sql entity-framework repository-pattern unit-of-work

我在删除一个在SO上似乎相当频繁的实体时遇到问题,但到目前为止,没有一个答案可以解决我的问题。

  

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

我有Device个实体,设备可以在Folder。在Folder中我可以删除设备没问题。但是我有Rules可以应用于影响基于IP路由的文件夹。当规则应用于文件夹时我无法删除Device,如果相同的Rule应用于另一个文件夹,我可以删除它没问题。这非常令人困惑!

请注意,规则可以适用于Folder(即将适用于所有设备)或单个Device

public class Device
{
    public virtual ICollection<Folder> PresentInFolders { get; set; }
    public virtual RoutingRule RoutingRule { get; set; }
}

public class Folder : IValidate
{
    public virtual ICollection<Device> Devices { get; set; }
}

public class RoutingRule
{
    public virtual Folder Folder { get; set; }
    public virtual Device Device { get; set; }
}

删除代码

    public void DeleteDevice(Device device)
    {
        try
        {
            if (null != device.RoutingRule)
            {
                var repo = this.uow.GetRepository<RoutingRule>();
                repo.Delete(device.RoutingRule);
                device.RoutingRule = null;
            }    

            foreach (var folder in device.PresentInFolders.ToList())
            {
                folder.Devices.Remove(device);
            }
            device.PresentInFolders.Clear();

            this.serviceCollection.Delete(device);
            this.uow.Save();
        }
        catch (Exception ex)
        {
            throw new Exception("Failure deleting device", ex);
        }
    }

任何人都可以了解删除Device无效的原因吗?

0 个答案:

没有答案