流畅的NHibernate一对多禁用外键约束

时间:2012-10-16 12:04:57

标签: nhibernate fluent-nhibernate foreign-key-relationship has-many automapping

我有这个问题,我有一对多的关系,我必须能够删除父实体,而不删除它们的子项,也不能将它们的外键列设置为NULL。但每当我尝试删除父项时,我都会遇到外键约束违例异常。

  

NHibernate.Exceptions.GenericADOException:无法执行更新查询[SQL:从[Customer]中删除] ---> System.Data.SqlClient.SqlException:DELETE语句与REFERENCE约束“FK7867CB245055157F”冲突

我有一个类似的一对一关系,我必须能够在一端删除实体而不将另一端的外键设置为NULL并且我使用NotFound成功解决了这个问题。忽视()。我找到了几个答案,提出了这个解决方案,但似乎根本没有效果。我使用我的映射来构建数据库BTW。

以下是我的实体和映射:

public class User : Entity
{
    ...
    public virtual Customer Customer { get; set; }
    ...
}
public class Customer : Entity
{
    ...
    public virtual string CustomerNumber { get; set; }
    public virtual User User { get; set; }
    public virtual IList<Vehicle> Vehicles { get; set; }
    ...
}
public class Vehicle : Entity
{
    ...
    public virtual string SerialNumber { get; set; }
    public virtual Customer Customer { get; set; }
    ...
}

我正在使用AutoMapping并覆盖:

public class UserMappingOverride : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        ...
        mapping.References(u => u.Customer).Column("CustomerNumber").NotFound.Ignore();
    }
}
public class CustomerMappingOverride : IAutoMappingOverride<Customer>
{
    public void Override(AutoMapping<Customer> mapping)
    {
        mapping.Id(u => u.Kundenummer).GeneratedBy.Assigned().Not.Nullable();
        mapping.HasOne(u => u.User).PropertyRef(c => c.Customer);
        mapping.HasMany(u => u.Vehicles).KeyColumns.Add("CustomerNumber")
            .Cascade.None()
            .Inverse();
    }
}
public class VehicleMappingOverride : IAutoMappingOverride<Vehicle>
{
    public void Override(AutoMapping<Vehicle> mapping)
    {
        mapping.Id(u => u.SerialNumber).GeneratedBy.Assigned().Not.Nullable();
        mapping.References(u => u.Customer).Column("CustomerNumber").NotFound.Ignore();
    }
}

如上所述,在一对一关系中,在User I的映射中,使用NotFound.Ignore(),它按照承诺执行 - 允许我删除客户而不触发约束违规异常并仍然保留值用户表中的“CustomerNumber”完整。当从映射构建数据库时,用户和客户实体之间关系的映射根本不会在数据库中产生外键约束。

但同样的事情对我的一对多关系不起作用。虽然映射与我的一对一关系几乎相同,并且我在这里的类似问题中使用了NotFound.Ignore(),但这种关系仍会产生外键约束,并且在尝试删除时出现约束违例异常一个客户。唯一的解决方法是手动删除数据库中的FK或通过将Enforce Foreign Key Constraint设置为False来修改它。

在构建数据库时,如何让NHibernate不创建此外键约束,或将Enfore外键约束设置为False?

最诚挚的问候 - 尼古拉伊

BTW:我对关于实体和关系的整体设计的评论不感兴趣。它们的设计基于数据来源的约束,这是唯一合理的解决方法。 :-)我发现在类似的帖子中有很多答案,专注于设计评估,然后是手头的问题。

2 个答案:

答案 0 :(得分:1)

您无法解决数据库中的FK问题。我的猜测是用户与客户之间没有FK。如果您从映射创建架构,则需要使用mapping.References(u => u.Customer).ForeignKey("none");

禁用FK的创建

答案 1 :(得分:0)

Firo的回答指出我正确的方向是如何摆脱FK约束。但是,{Vehicle}映射中添加.ForeignKey("none")并没有这样做。但是向Customer映射添加类似的属性解决了我的问题。

所以解决方案成了:

mapping.HasMany(u => u.Vehicles).ForeignKeyConstraintName("none")