【问题标题】:Fluent NHibernate one-to-many disable foreign key constraintFluent NHibernate 一对多禁用外键约束
【发布时间】:2012-10-20 19:08:47
【问题描述】:

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

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

我有类似的一对一关系,我必须能够删除一端的实体,而另一端的外键不设置为 NULL,我通过使用 NotFound 成功解决了这个问题。忽视()。我找到了几个答案,确切地表明了这个解决方案,但它似乎根本没有效果。我使用我的映射来构建数据库顺便说一句。

这是我的实体和映射:

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; }
    ...
}

我正在使用自动映射和覆盖:

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();
    }
}

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

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

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

最好的问候 - 尼古拉

顺便说一句:我对有关实体和关系的整体设计的 cmets 不感兴趣。它们是基于数据源的约束而设计的,这是唯一可行的解​​决方法。 :-) 我在类似的帖子中发现了很多答案,重点是设计评估者然后是手头的问题。

【问题讨论】:

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


    【解决方案1】:

    您无法解决数据库中的 FK。我的猜测是从用户到客户没有 FK。如果您从映射创建 Schema,那么您需要使用 mapping.References(u =&gt; u.Customer).ForeignKey("none"); 禁用 FK 的创建

    【讨论】:

    • 你的猜测是正确的。我试图解释这是当前的行为,但我可能不够清楚:“用户和客户实体之间的关系映射,根本不会在数据库中产生外键约束,当数据库是根据映射构建的。” 不过,您的回答指出了正确的方向,我知道我必须摆脱 FK,只是不知道如何让 NHibernate 为我做这件事。
    【解决方案2】:

    Firo 的回答为我指明了如何摆脱 FK 约束的正确方向。将.ForeignKey("none") 添加到车辆映射并没有做到这一点。但是向 Customer 映射添加一个类似的属性解决了我的问题。

    所以解决方案变成了:

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

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2017-01-14
      • 2018-05-29
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多