나는 일대 다 관계를 가지고 있고 삭제되지 않고 부모 엔티티를 삭제할 수 있어야하고 외래 키 열 NULL로 설정하십시오. 하지만 부모를 삭제하려고 할 때마다 외래 키 제약 조건 위반 예외가 발생합니다.Fluent NHibernate one-to-many foreign key 제약 해제
NHibernate.Exceptions.GenericADOException는 : 업데이트 쿼리를 실행할 수 없습니다 [SQL :에서 삭제 [고객] ---> System.Data.SqlClient.SqlException : 참조 제약 조건 "FK7867CB245055157F"
와 충돌 DELETE 문
필자는 비슷한 일대일 관계가 있는데, 한쪽 엔티티를 다른 쪽 끝의 외부 키를 NULL로 설정하지 않고 엔티티를 삭제할 수 있어야하며이 엔티티를 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; }
...
}
을 : 여기
내 엔티티와 매핑이 로 말했다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"값을 그대로 유지합니다. 사용자와 고객 엔티티 간의 관계 맵핑은 데이터베이스가 맵핑에서 빌드 될 때 단순히 데이터베이스에 외래 키 제한 조건을 생성하지 않습니다.
하지만 내 일대 다 관계에서도 똑같은 문제가 해결되지 않습니다. 매핑이 내 일대일 관계와 거의 같지만 NotFound.Ignore()를 비슷한 질문에서 제안한대로 사용하면이 관계는 여전히 외래 키 제약 조건을 생성하며 삭제하려고하면 제약 조건 위반 예외가 발생합니다. 고객. 유일한 해결 방법은 데이터베이스에서 FK를 수동으로 삭제하거나 Enfor Foreign Key Constraint를 False로 설정하여 수정하는 것입니다.
어떻게이 외래 키 제약 조건을 만들지 않거나 데이터베이스를 만들 때 외래 키 제약 조건을 거짓으로 설정하도록 NHibernate를 얻을 수 있습니까?
베스트 감사합니다 -
Nikolaj
은 BTW : 나는 엔티티와 관계의 전반적인 디자인에 대한 의견에 관심이 아니에요. 데이터 원본의 제약 조건을 기반으로 설계되었으므로 가능한 유일한 해결 방법입니다. :-) 비슷한 게시물에서 많은 답변을 찾았습니다. 디자인에 중점을두고 문제의 질문에 집중하십시오.
당신의 추측은 정확합니다. 나는 이것이 현재의 행동이라고 설명하려고 노력했다. 그러나 나는 충분히 명확하지 않을 수도있다. _ "사용자와 고객 엔티티 사이의 관계 맵핑은 데이터베이스가 외래 키 제약 조건 일 때 단순히 외래 키 제약 조건을 생성하지 않는다. 매핑에서 빌드. "_ 당신의 대답은 올바른 방향으로 지적했지만, 나는 FK를 제거해야만한다는 것을 알았고, NHibernate가 나를 위해 그것을 어떻게 만들지 확신하지 못했습니다. –