NHibernate多对一的关系

时间:2012-07-23 12:12:18

标签: sql nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我们有以下域对象: -

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

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

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

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

  1. 删除UserDevice对象,因此删除UserDecipient而不删除DeviceRecipient,因为它将在域模型中的其他位置使用。我们只想在删除UserDevice时将null设置为DeviceRecipient的UserDevice_Id列。
  2. 我们希望使用流畅的nhibernate约定来实现它,因为我们使用Automapping。
  3. 任何帮助都会很明显..提前致谢。

1 个答案:

答案 0 :(得分: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(可选 - 默认为exception):指定外来的方式   将处理引用缺失行的键:ignore将处理a   缺少行作为空关联。

因此,当您设置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