2011-03-01 4 views
2

Entity Framework 코드 첫 : 고객/주소 관계를 어떻게 모델링 할 수 있습니까?

다음은 간단한 모델입니다.

public class Customer 
{ 
    public int ID { get; set; } 
    public int MailingAddressID { get; set; } 
    [ForeignKey("MailingAddressID")] 
    public Address MailingAddress { get; set; } 

    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int ID { get; set; } 
    public int CustomerID { get; set; } 
    [ForeignKey("CustomerID")] 
    public Customer Customer { get; set; } 
} 

데이터베이스를 만들 때 다음 오류가 발생합니다.

Introducing FOREIGN KEY constraint 'Customer_MailingAddress' on table 'Customers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

문제가 무엇인지 이해하지 못합니다. 본인은 주소가있는 고객을 삭제할 수 없으며 또한 고객의 우편 주소 인 주소도 삭제할 수 없다는 것을 알고 있습니다.

고객이 하나 이상의 주소를 가지고있는 경우 우편 주소 여야하며 그 주소는 삭제할 수 없기 때문에 이는 내 설계와 맞습니다.

그래서 내가 여기서 무엇을 놓치고 있습니까? 감사!

편집 :

OnModelBuilding 메서드에서 다음 줄을 추가했음을 잊어 버렸습니다.

modelBuilder.Entity<Customer>().Property(x => x.MailingAddressID).IsOptional(); 

이렇게하면 데이터베이스를 만들 수 있지만 고객을 추가 할 때 다음과 같은 오류가 발생했습니다 :

The INSERT statement conflicted with the FOREIGN KEY constraint "Customer_MailingAddress". The conflict occurred in database "DomainModel.SeasideHeightsEntities", table "dbo.Addresses", column 'ID'. The statement has been terminated.

여전히 제대로 모델링하는 방법에 관한 손실.

답변

3

문제는 ... 처음에 삭제되었거나 고객 또는 우편 주소가 되었습니까? 동시에 둘 다 삭제할 ​​수 없으며, 삭제는 순서대로 수행됩니다. 첫 번째 항목이 삭제되면 두 번째 항목이 아직 삭제되지 않은 규칙 b/c에 실패합니다.

본인의 모델에서 볼 수 있듯이이 논리를 처리하는 데 외래 키를 사용하지 않으므로 외래 키 대신 MailingAddress 속성에 [필수] 특성을 추가하여 개체 유효성 검사 중에 처리 할 수 ​​있습니다.

또한 MailingAddress가 Addresses 컬렉션에 포함되도록 추가 구현 논리를 고려해야합니다.

+0

고객이 우편 주소를 가지고있는 한 삭제할 수 없어야합니다! 그것은 내가 FK 관계가 합리적이라고 생각하는 이유 중 하나입니다. 이것은 정상적인 데이터베이스 우선 EF 프로그램에서 정상적으로 작동합니다. 코드 우선 접근 방식으로 구현할 수있는 방법에 대한 제안 사항은 무엇입니까? 감사! –

+1

나는 정중하게 의견이 맞지 않는다. 뭔가 관계를 소유해야합니다. 이 경우 고객이 도메인 집합체 인 것처럼 보이므로 메일 주소를 관리해야합니다. – Paul

+0

나는 그 말이 이치에 맞는지 알 수 있습니다. 이 경우 CTP 유창한 API를 통해 고객을 삭제할 때 연결된 메일 주소 (또는 "소유"한 다른 항목)도 삭제해야한다고 지정할 수 있습니까? –