我有这个问题,我有一个一对多的关系,我必须能够删除父实体而不删除它的子实体,也不能将它们的外键列设置为 NULL。但是每当我尝试删除父级时,我都会收到外键约束违规异常。
NHibernate.Exceptions.GenericADOException:无法执行更新查询[SQL:从 [Customer] 删除] ---> System.Data.SqlClient.SqlException:DELETE 语句与 REFERENCE 约束“FK7867CB245055157F”冲突
我有类似的一对一关系,我必须能够在一端删除实体而另一端的外键设置为 NULL,我通过使用 NotFound.Ignore() 成功解决了这个问题. 我找到了几个答案,确切地表明了这个解决方案,但它似乎根本没有效果。我使用我的映射来构建数据库 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();
}
}
如前所述,在一对一的关系中,在用户的映射中,我使用 NotFound.Ignore(),它按承诺执行 - 允许我在不触发约束违反异常的情况下删除客户,并且仍然保留“CustomerNumber”的值" 在用户表中完好无损。User 和 Customer 实体之间关系的映射,在从映射构建数据库时,根本不会在数据库中产生外键约束。
但同样的事情不适用于我的一对多关系。尽管映射与我的一对一关系几乎相同,并且我使用 NotFound.Ignore() 在这里的类似问题中建议,但这种关系仍然会产生外键约束,并且在尝试删除时出现约束违规异常一个客户。唯一的解决方法是手动删除数据库中的 FK 或通过将 Enforce Foreign Key Constraint 设置为 False 来修改它。
在构建数据库时,如何让 NHibernate 不创建此外键约束或将 Enfore 外键约束设置为 False?
最好的问候 - 尼古拉
顺便说一句:我对关于实体和关系的整体设计的评论不感兴趣。它们是基于数据源的约束而设计的,这是唯一可行的解决方法。:-) 我在类似的帖子中发现了很多答案,重点是设计评估者,然后是手头的问题。