【发布时间】: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