3

주소 테이블에 연결되는 사용자 테이블이있는 관계를 만들어야합니다. 문제는 역사적인 주소를 저장하기 위해 주소 테이블이 필요하다는 것입니다. 사용자가 주소를 전혀 가지고 있지 않을 수도 있습니다. Entity Framework 4.1 코드 우선 - 두 테이블간에 두 개의 서로 다른 관계를 생성하는 방법

public class user 
{ 
    public virtual int ID { get; set; } 
    ... 
    public virtual int? AddressId { get; set; } 

    [ForeignKey("AddressId")] 
    public virtual Address CurrentAddress { get; set; } 

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

public class Address 
{ 
    public virtual int ID { get; set; } 
    ... 
} 

나는이 작업을 얻을 수있는 다양한 방법을 시도하고 사용자와 주소 사이에 다른 테이블을 넣어 같은 다양한 오류를 가지고 :

public class HistoricAddress 
{ 
    public virtual int ID { get; set; } 
    public Address HistoricAddress { get; set; } 
} 

public class user 
{ 
    public virtual int ID { get; set; } 
    public virtual Address CurrentAddress { get; set; } 
    public virtual ICollection<HistricAddress> HistoricAddresses { get; set; } 
    ... 
} 

및 기타 다양한 방법을하지만,이 또한 오류를 던졌습니다. 이것을하기위한 적절한 방법이 있어야합니다. 마지막 오류는 다음과 같습니다.

"System.Data.Entity.Infrastructure.DbUpdateException : 항목을 업데이트하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외 참조 ---> System.Data.UpdateException : 오류가 발생했습니다. 자세한 내용은 내부 예외 참조 System.InvalidOperationException : ReferentialConstraint의 종속 속성이 저장소 생성 열에 매핑됩니다. 열 : 'ID'. "

+0

첫 번째 코드 스 니펫의 문제점은 무엇입니까? 코드 - 첫 번째 규칙은'User'와'Address' 사이의 두 가지 관계로 더 이상 설정하지 않고 올바르게 매핑해야합니다. 그렇지 않습니까? – Slauma

답변

4

다음 모델을 3 개의 테이블로 매핑 할 수 있습니다. 생성

public class user 
{ 
    public virtual int ID { get; set; } 
    ... 
    public virtual int? AddressId { get; set; } 

    public virtual Address CurrentAddress { get; set; } 

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

public class Address 
{ 
    public virtual int ID { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    ... 
} 
사용자 정의의 OnModelCreating 메서드를 재정의

DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
     .HasOptional(user => user.CurrentAddress).WithMany() 
     .HasForeignKey(user => user.AddressId); 

    modelBuilder.Entity<User>() 
     .HasMany(user => user.HistoricAddresses) 
     .WithMany(address => address.Users) 
      .Map(m => 
      { 
       m.ToTable("UserAddresses"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("AddressId"); 
      }); 
} 

테이블

  • UserAddresses
  • 주소

    • 사용자입니다
  • +0

    세 번째 테이블이 여기에 오는 곳을 볼 수 없기 때문에 두 개의 테이블을 의미 했습니까? 나는 또한 두 번째 유창함 -API 매핑 (.HasForeignKey는 다 대다 관계에 지원되지 않았다)에 문제가 있었다. .HasForeignKey없이 시도했지만 코드를 실행할 때 내 게시물에서 언급 한 것과 같은 오류가 발생했습니다. – JohnCambell

    +0

    @JohnCambell 세 번째 테이블은'UserAddresses'입니다. '.HasForeignKey' 실수로 추가되었습니다. 내 업데이트 된 답변을 참조하십시오. – Eranga

    +0

    지금 세 번째 테이블 비트를 얻었습니다. 엔티티를 생각하고있었습니다. – JohnCambell