2017-11-29 12 views
0

을 정의하는 방법엔티티 프레임 워크 코드 첫 번째 - 내가 ASP.NET 코어와 엔티티 프레임 워크를 사용하고 사용자 정의 탐색 속성

나는 기존의 데이터베이스 스키마를 가지고 있고, 나는 외국를 사용하여 연결된 테이블을 추가 할 그러나 외부 키 인덱스 열은 표준 EF 규칙을 따르는 것이 아닙니다. EF에서 이것을 어떻게 표현할 수 있습니까? 가능하다면 Data Annotation 속성을 사용하는 것을 선호하지만 그렇지 않은 경우 ModelBuilder 유창 API를 사용하는 것이 좋습니다.

본질적이 : 상기 모델에서

[Table("widgets")] 
class Widget { 
    [Key, Column("id")] 
    int Id { get; set; } 

    [Column("referencenumber")] 
    int ReferenceNumber { get; set; } 

    public WidgetReferenceData ReferenceData // ???? How do I express this? 
} 

[Table("widgetreferences")] 
class WidgetReference { 
    [Key, Column("referencenumber")] 
    int ReferenceNumber { get; set; } 

    [Column("value")]  
    string Value { get;set; } 
} 

하기, WidgetWidgetReference 테이블 0 또는 1 연관된 엔트리를 가질 수의 widgets.referencenumber 데이터베이스 컬럼을 사용하여 연결.

위젯 모델에 연결된 WidgetReference (또는 존재하지 않는 경우 null)를로드하고로드하려면이 위젯 모델에 속성을 추가하고 싶습니다. 기본적으로 나는 다음과 같이 사용할 수 있도록하려면 :

var referenceValue = FindWidget().ReferenceData?.Value; 

은 기존의 "ID"열을한다면, EF가 알아서 것이지만, 사용자 정의 데이터베이스 컬럼과 재산의 이름을 가지고, 어떻게 할 이 관계를 표현하시오.

결과에 영향을 줄지는 모르겠지만 widgetreferences.referencenumber은 외래 키가 아니라 인덱스가있는 열입니다. 우리 비즈니스 로직은 위젯이 삭제되면 여전히 참조 데이터를 유지하려고합니다.

Google 검색을 통해 이에 대한 답변을 찾으려고 시도했지만 실패한 것처럼 보였습니다. :-(

+0

제목 말한다는 코드입니다 먼저, 시체가 먼저 DB라고 말하니? 비계를 세우면 비계가 관계를 어떻게 나타낼까요? (아니면 FK가 없어서 귀찮지 않습니까?) 위젯과 참조의 x : y 관계? –

+0

먼저 코드를 작성하십시오. 나는 edmx 매핑 파일을 사용하지 않고있다. 관계는 위젯에 0 또는 하나의 참조 ("referencescenumber"열에 대한 조인)가 있지만 참조가 삭제되는 위젯에서 살아남을 수 있다는 점이 다릅니다. –

+0

Like https://stackoverflow.com/questions/35501552/code-first-of -ef-how-to-define-navigation-property-relationship-without-setting? 이러한 것들에 대한 일반적인 합의는 EF가 FK를 생성 한 다음 DB에서 삭제하도록하는 것으로 보입니다. 만약 그것이 올바른 방법으로 열쇠를 맞췄다면, "누락 된 캐스케이드 삭제"종류가되도록 변경할 수 있습니다. 그래서 참조가 widgetid를 잃어 버릴 수 있습니다. (그러나 반대 방향과 관련이있는 것처럼 보입니다. 위젯이 widgetid를 갖는 참조가 아닌 referenceid를 가짐) 위젯이 사라지는 경우 –

답변

1
[Table("widgets")] 
    class Widget 
    { 
     [Key, Column("id")] 
     int Id { get; set; } 

     [Column("referencenumber")] 
     int? ReferenceNumber { get; set; } 

     [ForeignKey("ReferenceNumber")] 
     public virtual WidgetReferenceData ReferenceData // ???? How do I express this? 
    } 

    [Table("widgetreferences")] 
    class WidgetReference 
    { 
     [Key, Column("referencenumber")] 
     int ReferenceNumber { get; set; } 

     [Column("value")]  
     string Value { get;set; } 
    } 

는 그냥 외래 키 속성과 탐색 속성을 연결합니다 ForeignKeyAttribute를 사용합니다. 실제로 백엔드에서 외래 키가있는 경우 EF는 상관하지 않는다.

+0

모델에'[ForeignKey ("ReferenceNumber")]'를 넣었는지 여부에 관계없이 EF는 WidgetReference와 위젯 사이의 명시적인 외래 키입니다. 이는 내가 원하는 것이 아닙니다. –

+0

기존 데이터베이스 스키마가있는 경우 마이그레이션을 전혀 사용하지 않아야합니다. –

+0

기존 데이터베이스 스키마가 이전 마이그레이션을 사용하여 생성되었습니다 ... 모든 기존 데이터를 손상시키지 않고 비즈니스 요구 사항 (보조 키를 통해 연결된 선택적 추가 데이터)을 표현하는 것입니다. –