1

我们有以下域对象:-

public class UserDevice : BaseObject
{
// different properties to hold data
}

public class DeviceRecipient:BaseObject
{
 public virtual UserDevice LastAttemptedDevice{get;set;}
}

因此,使用 fluent nhibernate automapper 基于此创建的 sql 模式就像 DeviceRecipient 的表具有 UserDevice 的主键作为外键,即 UserDevice_Id。

现在,当我们尝试删除 UserDevice 对象时,它会为外键约束提供 sql 异常。我们要做的是:-

  1. 删除 UserDevice 对象,因此删除 UserDevice 行而不删除 DeviceRecipient,因为它将在域模型中的其他地方使用。当我们删除 UserDevice 时,我们只想将 DeviceRecipient 的 UserDevice_Id 列设置为 null。
  2. 当我们使用 Automapping 时,我们希望使用流畅的 nhibernate 约定来做到这一点。

任何帮助将是可观的..提前谢谢.!

4

1 回答 1

1

如我所见,您具有单向多对一关系。所以首先你必须编写以下覆盖:

public class DeviceRecipientOverride : IAutoMappingOverride<DeviceRecipient>
{
    public void Override(AutoMapping<DeviceRecipient> mapping)
    {
        mapping.References(x => x.LastAttemptedDevice)
            .NotFound.Ignore(); // this doing what you want.
    }
}

其次,如果您有更多具有此行为的地方,您可以将其转换为自动映射约定。

public class ManyToOneNullableConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        var inspector = (IManyToOneInspector) instance;
        // also there you could check the name of the reference like following:  
        // inspector.Name == LastAttemptedDevice
        if (inspector.Nullable) 
        {
            instance.NotFound.Ignore();
        }
    }
}

编辑

来自 NHibernate 参考

not-found(可选 - 默认为异常):指定如何处理引用缺失行的外键:ignore 会将缺失的行视为空关联。

因此,当您设置not-found="ignore"SchemaExport/SchemaUpdate 时,不会为您创建 FK。因此,如果您有 FK,则需要将其删除或将 FK 的 OnDelete 行为设置为Set Null. 假设您使用的是 Microsoft Sql Server:

ALTER TABLE [DeviceRecipient] 
    ADD CONSTRAINT [FK_DeviceRecipient_LastAttemptedDevice] 
    FOREIGN KEY ([LastAttemptedDevice_ID]) 
    REFERENCES [UserDevice]
    ON DELETE SET NULL
于 2012-07-23T15:32:07.080 回答