我们有以下域对象: -
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异常。我们想要做的是: -
任何帮助都会很明显..提前致谢。
答案 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