Sql NHibernate多对一关系

Sql NHibernate多对一关系,sql,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,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;} } 因此,使用fluent nhibernate automapper基于此创建的sql模式如下 DeviceRecip

我们有以下域对象:-

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\u Id

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

  • 删除UserDevice对象,从而删除UserDevice行,而不删除DeviceRecipient,因为它将在域模型中的其他地方使用。删除UserDevice时,我们只想将DeviceRecipient的UserDevice\u Id列设置为null
  • 我们希望在使用自动映射时使用流畅的nhibernate约定
    任何帮助都是值得的。。提前谢谢

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

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

    从NHibernate参考

    找不到(可选-默认为异常):指定外部 将处理引用缺少行的键:忽略将处理 缺少作为空关联的行

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

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

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

    从NHibernate参考

    找不到(可选-默认为异常):指定外部 将处理引用缺少行的键:忽略将处理 缺少作为空关联的行

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

    更正:-这不是一对一的关系..更正:-这不是一对一的关系..我两个都试过..但问题仍然存在。。我签入了数据库,外键允许为NULL。我还需要做其他检查吗?好的,我会看一看,但是当使用
    notfound=“ignore”
    时,SchemaExport/SchemaUpdate可能不会创建FK。我将更深入地了解..是的..将FK的OnDelete行为设置为Set NULL worked。。!我两个都试过了,但问题仍然存在。。我签入了数据库,外键允许为NULL。我还需要做其他检查吗?好的,我会看一看,但是当使用
    notfound=“ignore”
    时,SchemaExport/SchemaUpdate可能不会创建FK。我将更深入地了解..是的..将FK的OnDelete行为设置为Set NULL worked。。!