2016-11-19 2 views
0

외래 키가 null 일 수있는 EF에서 일대일 관계를 만들려고합니다 (따라서 0..1에서 0..1로 호출 할 수 있음)nullable 외래 키와 일대일 관계

public class ProductInstance 
{ 
    public int Id { get; set; } 

    public int SaleId { get; set; } 
    public Sale Sale { get; set; } 
} 


public class Sale 
{ 
    public int Id { get; set; } 
    public ProductInstance ProductInstance { get; set; } 
} 

FluentAPI 구성 :

modelBuilder.Entity<Sale>() 
    .HasOptional(x => x.ProductInstance) 
    .WithOptionalPrincipal(x => x.Sale); 

그러나 테이블 ProductInstance에 두 개의 열을 발생입니다 :

  • Sale_id - 외래 키
  • SaleId

여기에서 생성 된 마이그레이션 코드 :

CreateTable(
      "dbo.ProductInstances", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        SaleId = c.Int(nullable: false), 
        Sale_Id = c.Int(), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Sales", t => t.Sale_Id) 
      .Index(t => t.Sale_Id); 

어떻게 외국 열쇠가 될 것입니다 하나 개의 컬럼 만 SaleId을 얻기 위해 무엇을 할 수 있는가?

+1

하는 Sale 인스턴스의 ID를 보유하고 있습니까? 그것이 테이블에 2 개의 열이 생성되는 이유입니다. –

+0

EF는 Entity Framework의 약자이므로 데이터 개체가 값 개체가 아닌 개체로만 작동합니다. 아마 후자의 버전에서도 value 객체를 지원할 것입니다. – Mohamadreza

답변

4

EF는 명시 적으로 FK 속성을 one-to-one 연결을 지원하지 않습니다.

public class ProductInstance 
{ 
    public int Id { get; set; } 
    public Sale Sale { get; set; } 
} 

public class Sale 
{ 
    public int Id { get; set; } 
    public ProductInstance ProductInstance { get; set; } 
} 

및 구성 :

유일한 해결책은 모델과 함께 끝나는 ProductInstance.SaleId 속성을 제거하는 것입니다 왜 당신이 판매 인스턴스에 연결하고, 등록 정보를 모두 만들려면 어떻게해야합니까

modelBuilder.Entity<Sale>() 
    .HasOptional(x => x.ProductInstance) 
    .WithOptionalPrincipal(x => x.Sale) 
    .Map(a => a.MapKey("SaleId")); 
3

다른 관계보다 Entity Framework에서 일대일 또는 일대 다 관계를 구성하는 것이 다소 복잡합니다 !! 다음과 같이

는 외래 키 속성을 쓰기 :

public class ProductInstance 
{ 
    public int Id { get; set; } 

    public virtual Sale Sale { get; set; } 
} 


public class Sale 
{ 
    [Key] 
    [ForeignKey("ProductInstance")] 
    public int ProductInstanceId { get; set; } 

    ///write here other properties 

    public virtual ProductInstance ProductInstance { get; set; } 
} 

가 예상대로 그것은 지금 작동합니다 희망!

또한 일반적으로 Entity Framework의 명명 규칙을 올바르게 따르면 Fluent API가 필요하지 않습니다. 더 HasForeignKey 유창 API가없는 당신이 ForeignKey 데이터 주석을 해결하려고하면 마이그레이션하는 동안 다수의 예외를 얻을 것이다 -

+0

@Alexey Markov, 내 코드를 테스트하십시오 !! 예상대로 작동하는 경우 유사한 문제를 가진 다른 사람들을 도울 수있는 답변으로 표시하십시오 !! – TanvirArjel

+0

코드는 작동하지만,이 경우에는 판매가 요구되는 ProductInstance가 있지만 그 사실을 알지 못합니다. 주요한 문제 - nullable foreign key. Ivan Stoev는 이것이 지원되지 않는다고 말합니다. 따라서 내 모델에서 Foreign Key 속성을 제거하고 Navigation 속성 만 사용하십시오. –

+0

@Alexey Markov, 중요한 점을 놓치 셨습니다! 일대일 또는 일대일 관계의 경우에는 nullable 외래 키를 명시 적으로 필요로하지 않습니다 !! 외래 키는 기본적으로 nullable입니다. 코드 판매에 따르면 기본적으로 nullable입니다. 코드를 실행하고 테스트하십시오 !! – TanvirArjel