3

다음과 같은 모델이 있습니다.Entity Framework 4.1에서 "계산 된"속성을 처리하는 방법은 무엇입니까?

public class Post 
{ 
    public int Id {get;set;} 
    public virtual ICollection<Comment> Comments {get;set;} 
    public virtual ICollection<Reader> Readers {get;set;} 
    public int Value {get;set;} 
} 

규칙은 Value = Comments.Count * 2 + Readers.Count입니다.

"가치"의 "계산 된"특성을 다루는 가장 적절하고 편리한 방법은 무엇입니까?

의견이나 독자가 요소를 추가/제거 할 때 "값"을 계산하고 저장하는 것이 가장 좋습니다.

하지만 "DatabaseGeneratedAttribute"는 여기서는 사용하지 않는 것 같습니다.

감사합니다!

답변

3

이것은 지원되지 않습니다. 데이터베이스 열에 매핑되지 않은 경우 엔티티 쿼리에 대해 Value을 사용할 수있는 방법이 없습니다. 매핑을 위해 EDMX를 사용하는 EF의 경우이 매핑은 맞춤 매핑 된 SQL 함수 또는 model defined function을 사용하여 해결할 수 있지만 코드 첫 번째 매핑은 그 중 아무 것도 지원하지 않습니다. 다른 방법은 데이터베이스 뷰를 생성하고 엔티티를 볼 수 있도록 매핑하는 것입니다. 그런 경우 엔티티는 읽기 전용입니다.

값을 정의하는 데 .NET 코드를 사용하면 데이터베이스에서로드 된 데이터로 계산 된 클라이언트 측 속성 만 항상 표시됩니다. 컬렉션이 변경 될 때마다 이벤트 핸들러가 사전 계산 된 값을 변경하여 관찰 가능한 컬렉션이 필요할 때마다 속성을 다시 계산하지 않으려는 경우

속성은 데이터베이스에서 생성 한 속성으로 표시합니다.이 경우 값을 변경할 수 없으며 데이터베이스는 올바른 값이 테이블에 저장되도록해야합니다.

3

귀하의 열 값이 매핑 된 두 속성을 기반으로한다고 생각합니다. NotMappedAttribute을 사용하여 런타임시 데이터베이스 스키마 및로드 값에서 특성을 제외하십시오.

public class Post 
{ 
    public int Id {get;set;} 
    public virtual ICollection<Comment> Comments {get;set;} 
    public virtual ICollection<Reader> Readers {get;set;} 

    [NotMapped] 
    public int Value 
    { 
     get return Comments.Count * 2 + Readers.Count; 
    } 
} 
+1

값을 Linq에서 엔터티로 사용할 수 없습니다 (예 : var q = db.Posts.Where (p => p.Value> 100). 그리고 성능이 좋지 않습니다. 값은 매번 계산됩니다. – Chance

0

DatabaseGenerated 특성을 사용하고 Value을 계산하기 위해 db에 트리거를 만들 수 있습니다. 이주 또는 db seed 메소드에서 트리거를 작성할 수 있습니다.

관련 문제