我有这个问题,我有一对多的关系,我必须能够删除父实体,而不删除它们的子项,也不能将它们的外键列设置为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:我对关于实体和关系的整体设计的评论不感兴趣。它们的设计基于数据来源的约束,这是唯一合理的解决方法。 :-)我发现在类似的帖子中有很多答案,专注于设计评估,然后是手头的问题。
答案 0 :(得分:1)
您无法解决数据库中的FK问题。我的猜测是用户与客户之间没有FK。如果您从映射创建架构,则需要使用mapping.References(u => u.Customer).ForeignKey("none");
答案 1 :(得分:0)
Firo的回答指出我正确的方向是如何摆脱FK约束。但是,{Vehicle}映射中添加.ForeignKey("none")
并没有这样做。但是向Customer映射添加类似的属性解决了我的问题。
所以解决方案成了:
mapping.HasMany(u => u.Vehicles).ForeignKeyConstraintName("none")