0

나는 일대 다 관계를 가지고 있고 삭제되지 않고 부모 엔티티를 삭제할 수 있어야하고 외래 키 열 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 : 나는 엔티티와 관계의 전반적인 디자인에 대한 의견에 관심이 아니에요. 데이터 원본의 제약 조건을 기반으로 설계되었으므로 가능한 유일한 해결 방법입니다. :-) 비슷한 게시물에서 많은 답변을 찾았습니다. 디자인에 중점을두고 문제의 질문에 집중하십시오.

답변

0

Firo의 대답에 따라 올바른 방향으로 FK 제약을 제거하는 방법이 나와 있습니다. Vehicle 매핑에 .ForeignKey("none")을 더하는 것은 그것을하지 않았다. 그러나 고객 매핑에 비슷한 속성을 추가하면 문제가 해결됩니다.

그래서 솔루션이되었다 :

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

데이터베이스에서 FK를 사용할 수 없습니다. 내 추측으로는 FK가 사용자에서 고객까지 있다는 것입니다. 매핑에서 스키마를 만들면 FK 생성을 비활성화해야합니다. mapping.References(u => u.Customer).ForeignKey("none");

+0

당신의 추측은 정확합니다. 나는 이것이 현재의 행동이라고 설명하려고 노력했다. 그러나 나는 충분히 명확하지 않을 수도있다. _ "사용자와 고객 엔티티 사이의 관계 맵핑은 데이터베이스가 외래 키 제약 조건 일 때 단순히 외래 키 제약 조건을 생성하지 않는다. 매핑에서 빌드. "_ 당신의 대답은 올바른 방향으로 지적했지만, 나는 FK를 제거해야만한다는 것을 알았고, NHibernate가 나를 위해 그것을 어떻게 만들지 확신하지 못했습니다. –