2017-11-11 6 views
0

나는 2 개의 테이블을 가지고 있는데 그들 사이의 관계는 필드 TableId1TableId2을 사용하여 연결됩니다.EF.6에서 데이터 주석을 사용하는 OneOrZero 관계?

두 개의 데이터가 연결되어 있으면 필드에 기본 키 값이 채워집니다.

는 표 필드 TableId2 의미 즉도 Table1.Id 충전 할 표 2에TableId1 피사계 Table2.Id 의해 충전된다.

그리고 필드도 모두 비어 일 수 있습니다. 즉, 데이터가 독립적이라는 의미입니다.

public class Table1 
{ 
    [Key] 
    public int Id { get; set; } 
    public string table1_desc { get; set; } 

    public int? TableId2 { get; set; } 
    [ForeignKey("TableId2")] 
    public Table2 Table2 { get; set; } 
} 

public class Table2 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Table2_desc { get; set; } 

    public int? TableId1 { get; set; } 
    [ForeignKey("TableId1")] 
    public Table1 Table1 { get; set; } 
} 

내 질문은, 데이터 주석를 사용하여이 문제를 해결하는 방법?. 가능한가? 위의 코드는 나에게 오류를주는 :

Unable to determine the principal end of an association between the types 'ConsoleApplication1.Data2' and 'ConsoleApplication1.Data1'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

감사 당신, Jigu Haslim는

답변

0

는 아니, 그건 불가능하다 - 전혀.

외래 키 제약 조건에는 주 유형과 종속 형식이 필요하므로 Nessacary 인 경우 계단식을 구성 할 수 있습니다. 그것은 excactly 오류 메시지가 무엇을 말하고 있습니다.

실용적인 예가 필요한 경우, 어미 고양이와 새끼 고양이 중 하나를 생각해보십시오. 어머니 고양이가 교장입니다. 새끼 고양이 없이도 존재할 수 있습니다. 그러나 새끼 고양이는 그 주된 어머니에게 강하게 의존한다.

어머니를 삭제하면 삭제가 새끼 고양이까지 계속됩니다. 자녀를 삭제하면 어머니가 계속 살게됩니다.

그래서 당신은 하나의 엔티티 주요

public class Table1 
{ 
    [Key] 
    public int Id { get; set; } 
    public string table1_desc { get; set; } 
    public Table2 Table2 { get; set; } 
} 

그리고

public class Table2 
{ 
    [Key, ForeignKey("Table1")] 
    public int Id { get; set; } 
    public string Table2_desc { get; set; } 

    public Table1 Table1 { get; set; } 
} 
0

종속 다른 하나는이 작업을 수행 할 수있는 방법은 아니지만 데이터 주석에,이, 을해야 나는 그것을 추천 할 것이라고 생각하지 않는다. (당신이 그것을 좋아하지 않는다면 나를 자유롭게 투표 할 수있다.)

트릭은 두 관계를 일대 다 관계로 매핑하는 것입니다.

public class Car 
{ 
    public int CarId { get; set; } 
    public string Name { get; set; } 
    public int? DriverId { get; set; } 
    public Driver Driver { get; set; } 
} 

public class Driver 
{ 
    public int DriverId { get; set; } 
    public string Name { get; set; } 
    public int? CarId { get; set; } 
    public Car Car { get; set; } 
} 

매핑 :

modelBuilder.Entity<Driver>() 
      .HasOptional(d => d.Car).WithMany() 
      .HasForeignKey(d => d.CarId); 
modelBuilder.Entity<Car>() 
      .HasOptional(c => c.Driver).WithMany() 
      .HasForeignKey(c =>c.DriverId); 

그러나 여기 단점의 자동차와 드라이버 예를 들어. 양쪽에서 관계를 수립해야합니다. 그렇지 않은 경우 DriverId으로 Car을 얻을 수 있으며 소속 드라이버는 CarId = null입니다. 하지만 네가 그렇게한다면 ...

var car = new Car { Name = "Ford" }; 
var driver = new Driver { Name = "Henry" }; 
driver.Car = car; 
car.Driver = driver; 

db.Set<Car>().Add(car); 
db.SaveChanges(); 

은 ... 예외가 발생합니다 : 의존하는 작업에 대한 올바른 순서를 확인할 수 없습니다

. 외부 키 제한 조건, 모델 요구 사항 또는 상점 생성 값으로 인해 종속성이있을 수 있습니다.

예, 운전자는 새 자동차의 기본 키와 새 운전자의 자동차를 필요로합니다.

var car = new Car { Name = "Ford" }; 
var driver = new Driver { Name = "Henry" }; 
driver.Car = car; 

db.Set<Car>().Add(car); 

using(var ts = new TransactionScope()) 
{ 
    db.SaveChanges(); 
    car.Driver = driver; 
    db.SaveChanges(); 
    ts.Complete(); 
} 

하지 너무 우아하고,이

입니다 :

그래서 이것은 당신이 이런 식으로 할 필요?

FYI : 이것은 더 나은 대안을 찾을 수있는 this answer의 옵션 중 하나입니다.